項目中問題記錄

最近做了一個springMVC+mybatis的項目,項目開發過程中比較順利,我使用的主要jar包如下列表:


其中基礎配置有個:一個是關於數據庫的,代碼如下:

<?xml version="1.0" encoding="UTF-8"?>  
<beans default-autowire="byType" xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    	http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
    	
    <import resource="classpath:META-INF/cxf/cxf.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
    
    <bean id="propertyConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
        <property name="locations">  
            <list>  
                <value>classpath:resources/prop/spring-jdbc.properties</value>  
            </list>  
        </property>  
    </bean>
    <!-- 
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
        <property name="driverClassName" value="${jdbc.driver}"></property>  
        <property name="url" value="${jdbc.url}"></property>  
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>  
    </bean>
     -->
     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="${jdbc.driver}"></property>
		<property name="url" value="${jdbc.url}"></property> 
		<property name="username" value="${jdbc.username}"></property>
		<property name="password" value="${jdbc.password}"></property>
		<property name="initialSize" value="${jdbc.initialSize}" />
		<property name="maxActive" value="${jdbc.maxActive}" />
		<property name="maxWait" value="${jdbc.maxWait}" />
		<property name="poolPreparedStatements" value="true" />
		<property name="testWhileIdle" value="true"/>
		<property name="validationQuery" value="select 1 from dual"/>
	</bean>
     
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
        <property name="configLocation" value="classpath:resources/mybatis/SqlMapConfig.xml"></property>  
        <property name="dataSource" ref="dataSource"></property>  
    </bean>
    
    <!-- 由spring管理mybatis的事物 -->  
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
        <property name="dataSource" ref="dataSource"></property>  
    </bean>  
    <!-- 定義攔截器,用來指定事物屬性,級別,和異常處理 -->  
    <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">  
        <property name="transactionManager" ref="transactionManager"></property>  
        <property name="transactionAttributes">  
            <props>  
                <!-- 
                PROPAGATION_SUPPORTS: 如果已經存在事務,則加入事務;如果沒有事務,則以非事務的方式執行;   
                PROPAGATION_MANDATORY: 使用當前事務, 如果沒有, 則拋出異常;   
                PROPAGATION_REQUIRED: 新建事務,如果當前有事務, 則掛起; 
                PROPAGATION_NOT_SUPPORTED:以非事務的方式執行, 如果當前有事務, 則掛起;   
                PROPAGATION_NEVER:以非事務的方式執行, 如果當前有事務,則拋出異常;   
                +/-Exception</prop> + 表示異常出現時事物提交 - 表示異常出現時事務回滾 -->  
                <prop key="get*">PROPAGATION_SUPPORTS,readOnly</prop>
                <prop key="select*">PROPAGATION_SUPPORTS,readOnly</prop> 
                <prop key="del*"> PROPAGATION_REQUIRED,-BusinessException</prop>  
                <prop key="delete*"> PROPAGATION_REQUIRED,-BusinessException</prop>  
                <prop key="update*">PROPAGATION_REQUIRED,-BusinessException</prop>  
                <prop key="save*">PROPAGATION_REQUIRED,-BusinessException</prop>  
                <prop key="add*">PROPAGATION_REQUIRED,-BusinessException</prop>  
            </props>  
        </property>  
    </bean>  
    <!-- 用來定義那些類需要採用事物管理 spring 事物的動態代理類 BeanNameAutoProxyCreator 根據類名自動代理,接受表達式 -->  
    <bean id="BeanProxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  
        <property name="beanNames">  
            <!-- 對類名以Service結尾的類進行代理 -->  
            <value>*Service*</value>  
        </property>  
        <!-- 對代理類進行加載攔截器(實現通知的過程) -->  
        <property name="interceptorNames">  
            <list>  
                <value>transactionInterceptor</value>  
            </list>  
        </property>  
    </bean> 
</beans>

一個是關於spring MVC的,代碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:mvc="http://www.springframework.org/schema/mvc" 
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd   
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd   
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

	<context:annotation-config />
	<!-- 把標記了@Controller註解的類轉換爲bean -->
	<context:component-scan base-package="cn.***.controller" />
	<!-- 啓動Spring MVC的註解功能,完成請求和註解POJO的映射 -->
	<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
	<mvc:annotation-driven />
	
	<!-- 對模型視圖名稱的解析,即在模型視圖名稱添加前後綴 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/view/" p:suffix=".jsp" p:viewClass="org.springframework.web.servlet.view.JstlView"/>

	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="utf-8" scope="prototype">
		<!-- 最大5m 1024 * 1024 * 5 * 6 -->
		<property name="maxUploadSize" value="31457280"/>
		<property name="maxInMemorySize" value="4096"/>
                <property name="resolveLazily" value="true"/>   
	</bean>
</beans>
通過壓力測試還算順利,但是當接入生產環境時候有了許多問題,其中問題在於與生產中許多外圍環境的接入,問題有:

1、單點登陸在集羣環境下的退出問題;

當單機訪問單點登陸服務器時,系統運行正常可是當我們的服務器是負載方式的時候系統就不能退出,問題就在於與負載有多臺機器,當單點服務器返回註銷消息時負載會隨便發送給一臺機器處理,當這臺機器正好是之前的機器註銷成功,如果不是則失敗——現在的做飯是建失敗的轉發給其他機器繼續處理,直到有成功的。                  

2、系統啓動後一段時間後不能再登陸,從系統後臺日誌可以看出是系統在從數據源中獲取連接時一直處於等待狀態,如果是數據連接不能獲取的話它會在一段時間之後會超時報錯,但是經過反覆測試未出現超時情況;疑點有兩個:一是在未接入單點登陸的時候系統未出現過這種問題;二是當數據庫連接池變更爲jdbc連接時不會出現問題。如果有哪位高手遇到過此問題,希望不吝賜教!

本人估計是線程死鎖,還在研究中。

3、系統使用的數據源是DBCP,問題二發生以後我們猜想是數據庫連接池的問題,有意將其修改爲c3p0,但是將其修改爲c3p0時卻出現瞭如下錯誤:

2014-09-24 20:07:04,276-[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0][DEBUG]-[BasicResourcePool]An exception occurred while acquiring a poolable resource. Will retry.
java.sql.SQLException: invalid arguments in call
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:113)

c3p0配置如下:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass"><value>oracle.jdbc.driver.OracleDriver</value></property>
		<property name="jdbcUrl"><value>${racURL}</value></property>
		<property name="user"><value>${username}</value></property>
		<property name="password"><value>${password}</value></property>
		<!-- 連接池中保留的最小連接數 -->
		<property name="minPoolSize"><value>5</value></property>
		<!-- 連接池中保留的最大連接數 -->
		<property name="maxPoolSize"><value>10</value></property>
		<!-- 最大空閒時間,60秒內未使用則連接被丟棄。若爲0則永不丟棄。Default: 0 -->
		<property name="maxIdleTime"><value>1800</value></property>
		<!-- 當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數 -->
		<property name="acquireIncrement"><value>5</value></property>
		<!-- 如果maxStatements與maxStatementsPerConnection均爲0,則緩存被關閉,maxStatementsPerConnection默認爲0 -->
		<property name="maxStatements"><value>0</value></property>
		<!-- 初始連接池大小 -->
		<property name="initialPoolSize"><value>5</value></property>
		<!-- 每60秒檢查所有連接池中的空閒連接。Default: 0 -->
		<property name="idleConnectionTestPeriod"><value>0</value></property>
		<!-- 定義在從數據庫獲取新連接失敗後重復嘗試的次數 -->
		<property name="acquireRetryAttempts"><value>3</value></property>
		<!-- 獲取連接失敗後該數據源將申明已斷開並永久關閉 -->
		<property name="breakAfterAcquireFailure"><value>false</value></property>
		<!-- 方法來提升連接測試的性能 -->
		<property name="testConnectionOnCheckout"><value>false</value></property>
	</bean>
有人說配置的問題,但是我的配置曾經在生產環境中使用過,沒有問題的到現在生產運行的相當穩定。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章