2、Spring之连接池使用

1、采用DBCP连接池:

(1)、加入相关jar包:commons-dbcp-1.2.jar。

(2)、通过properties配置文件配置数据库相关参数,暂且命名为:jdbc.properties,并放到src目录下,内容如下,此处以MySql为例:

<!--Mysql-->
datasource.driverClassName=com.mysql.jdbc.Driver
datasource.url=jdbc:mysql://localhost:3306/db_test?useUnicode=true&amp;characterEncoding=UTF-8
datasource.username=root
datasource.password=root
#hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

<!--Oracle-->
#datasource.driverClassName=oracle.jdbc.driver.OracleDriver
#datasource.url=jdbc:oracle:thin:@Jack:1521:db_test
#datasource.username=accp	
#datasource.password=accp
#hibernate.dialect=org.hibernate.dialect.Oracle9Dialect

<!--SqlServer2000-->
#jdbc.driverClassName=com.microsoft.jdbc.sqlserver.SQLServerDriver
#jdbc.url=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db_test
#jdbc.username=sa
#jdbc.password=123
#hibernate.dialect=org.hibernate.dialect.SQLServerDialect

<!--SqlServer2005-->
#jdbc.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
#jdbc.url=jdbc:sqlserver://localhost:1434;DatabaseName=db_test;SelectMethod=cursor
#jdbc.username=sa
#jdbc.password=123
#hibernate.dialect=org.hibernate.dialect.SQLServerDialect

 (3)、配置Spring配置文件applicationContext-resource.xml:

<!--加载数据配置文件对象-->
	<bean id="propertyConfigurer"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath:/jdbc.properties</value>
			</list>
		</property>
	</bean>

<!-- 配置数据库连接池,使用dbcp -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<!-- 指定连接数据库的驱动 -->
		<property name="driverClassName"
			value="${datasource.driverClassName}" />
		<!-- 指定连接数据库的URL -->
		<property name="url" value="${datasource.url}" />
		<!-- 指定连接数据库的用户名 -->
		<property name="username" value="${datasource.username}" />
		<!-- 指定连接数据库的密码 -->
		<property name="password" value="${datasource.password}" />
		<!-- 连接池启动时的初始值 -->
		<property name="initialSize" value="4" />
		<!-- 连接池的最大值 -->
		<property name="maxActive" value="100" />
		<!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止-->
		<property name="maxIdle" value="2" />
		<!-- 最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
		<property name="minIdle" value="1" />
	</bean>

 (4)、web.xml中配置,让Spring启动时处理对应配置文件即可。

<!-- spring配置文件的开始 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			classpath:/applicationContext-resource.xml
			classpath:/applicationContext-dao.xml
			classpath:/applicationContext-service.xml
			classpath:/applicationContext-action.xml
			<!-- WEB-INF/applicationContext-action.xml -->
		</param-value>
	</context-param>

2、采用Proxool连接池:

(1)、加入相关jar包:proxool-0.9.1.jar,proxool-cglib.jar。

(2)、通过xml配置文件配置数据库相关参数,暂且命名为:proxool.xml,并放到webroot目录下的WEB-INF目录下,内容如下,此处以MySql为例:

<?xml version="1.0" encoding="UTF-8"?>
<something-else-entirely>
	<proxool>
		<alias>db_test</alias>
		<driver-url>jdbc:mysql://127.0.0.1:3306/db_test</driver-url>
		<driver-class>com.mysql.jdbc.Driver</driver-class>
		<driver-properties>
			<property name="user" value="root" />
			<property name="password" value="root" />
		</driver-properties>
		<maximum-new-connections>10</maximum-new-connections>
		<prototype-count>5</prototype-count>
		<test-before-use>true</test-before-use>
		<test-after-use>true</test-after-use>
		<house-keeping-sleep-time>60000</house-keeping-sleep-time>
		<house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
		<maximum-connection-count>10</maximum-connection-count>
		<minimum-connection-count>2</minimum-connection-count>
	</proxool>
</something-else-entirely>

(3)、配置web.xml配置文件,加载连接池配置文件,初始化连接池。

<!--连接池配置-->
	<servlet>
		<servlet-name>ServletConfigurator</servlet-name>
		<servlet-class>
			org.logicalcobwebs.proxool.configuration.ServletConfigurator
		</servlet-class>
		<init-param>
			<param-name>xmlFile</param-name>
			<param-value>WEB-INF/proxool.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<!-- 监控proxool连接池的请求路径,请求后会返回一个监控连接池性能的页面 -->
	<servlet>
	   <servlet-name>Admin</servlet-name>
	   <servlet-class>
	    org.logicalcobwebs.proxool.admin.servlet.AdminServlet
	   </servlet-class>
	</servlet>
	<servlet-mapping>
	   <servlet-name>Admin</servlet-name>
	   <url-pattern>/admin</url-pattern>
	</servlet-mapping>

<!--注意,如果使用了Struts2,则需放行上面的请求,不要拦截,否则得不到监控页面-->
<!-- struts2,仅仅拦截action或者jsp后缀的请求 -->
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>
			org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
		</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>*.action</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>*.jsp</url-pattern>
	</filter-mapping>

 (4)、配置Spring配置文件applicationContext-resource.xml:

<bean id="dataSource"  class="org.springframework.jdbc.datasource.DriverManagerDataSource">
	    <property name="driverClassName">
	    	<value>org.logicalcobwebs.proxool.ProxoolDriver</value>
	    </property>
	    <property name="url">
	    	<value>proxool.db_test</value>
	    </property>
    </bean>

3、采用web应用服务器自带的连接池,采用jndi技术,这里采用WebLogic为例。

(1)、在对应应用服务器中配置连接池,注意webLogic中配置数据源的控制台为:http://127.0.0.1:7001/console,注意,配置时一定要点“下一步”到最后(有个页面有“测试”、“完成”按钮,此时注意还有一个“下一步”按钮,继续点击“下一步”指定“目标”,才会激活连接池,否则无法通过程序连接使用;当然如果没有执行这一步操作,完成后,在连接池列表中仍然可以单击“连接池名称”,进入配置页面,单击“目标”tab页选择目标以激活连接池)。

//如果Weblogic中配置数据源不激活,则在使用时会出现以下错误
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [applicationContext-resource.xml]: Invocation of init method failed; nested exception is javax.naming.NameNotFoundException: While trying to lookup 'jdbc.test' didn't find subcontext 'jdbc'. Resolved ''; remaining name 'jdbc/test'
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:567)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
	at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:385)
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:284)
	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
	at weblogic.servlet.internal.EventsManager$FireContextListenerAction.run(EventsManager.java:582)
	at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
	at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
	at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)
	at weblogic.servlet.internal.EventsManager.executeContextListener(EventsManager.java:233)
	at weblogic.servlet.internal.EventsManager.notifyContextCreatedEvent(EventsManager.java:190)
	at weblogic.servlet.internal.EventsManager.notifyContextCreatedEvent(EventsManager.java:175)
	at weblogic.servlet.internal.WebAppServletContext.preloadResources(WebAppServletContext.java:1730)
	at weblogic.servlet.internal.WebAppServletContext.start(WebAppServletContext.java:2740)
	at weblogic.servlet.internal.WebAppModule.startContexts(WebAppModule.java:1704)
	at weblogic.servlet.internal.WebAppModule.start(WebAppModule.java:781)
	at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:213)
	at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:208)
	at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:35)
	at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:70)
	at weblogic.application.internal.flow.ScopedModuleDriver.start(ScopedModuleDriver.java:212)
	at weblogic.application.internal.ExtensibleModuleWrapper.start(ExtensibleModuleWrapper.java:111)
	at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:124)
	at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:213)
	at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:208)
	at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:35)
	at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:70)
	at weblogic.application.internal.flow.StartModulesFlow.activate(StartModulesFlow.java:24)
	at weblogic.application.internal.BaseDeployment$2.next(BaseDeployment.java:729)
	at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:35)
	at weblogic.application.internal.BaseDeployment.activate(BaseDeployment.java:258)
	at weblogic.application.internal.SingleModuleDeployment.activate(SingleModuleDeployment.java:48)
	at weblogic.application.internal.DeploymentStateChecker.activate(DeploymentStateChecker.java:165)
	at weblogic.deploy.internal.targetserver.AppContainerInvoker.activate(AppContainerInvoker.java:79)
	at weblogic.deploy.internal.targetserver.BasicDeployment.activate(BasicDeployment.java:192)
	at weblogic.deploy.internal.targetserver.BasicDeployment.activateFromServerLifecycle(BasicDeployment.java:369)
	at weblogic.management.deploy.internal.DeploymentAdapter$1.doActivate(DeploymentAdapter.java:51)
	at weblogic.management.deploy.internal.DeploymentAdapter.activate(DeploymentAdapter.java:200)
	at weblogic.management.deploy.internal.AppTransition$2.transitionApp(AppTransition.java:30)
	at weblogic.management.deploy.internal.ConfiguredDeployments.transitionApps(ConfiguredDeployments.java:240)
	at weblogic.management.deploy.internal.ConfiguredDeployments.activate(ConfiguredDeployments.java:169)
	at weblogic.management.deploy.internal.ConfiguredDeployments.deploy(ConfiguredDeployments.java:123)
	at weblogic.management.deploy.internal.DeploymentServerService.resume(DeploymentServerService.java:186)
	at weblogic.management.deploy.internal.DeploymentServerService.start(DeploymentServerService.java:94)
	at weblogic.t3.srvr.SubsystemRequest.run(SubsystemRequest.java:64)
	at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)
	at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)
Caused by: javax.naming.NameNotFoundException: While trying to lookup 'jdbc.test' didn't find subcontext 'jdbc'. Resolved ''; remaining name 'jdbc/test'
	at weblogic.jndi.internal.BasicNamingNode.newNameNotFoundException(BasicNamingNode.java:1139)
 (3)、配置Spring配置文件applicationContext-resource.xml:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
	<property name="jndiName">
		<value>jdbc.test</value>
	</property>
	<property name="resourceRef">   
         <value>false</value>   
	</property> 
       <!--可要可不要-->
	<property name="jndiEnvironment">   
	    <props>   
		 <prop key="java.naming.provider.url">t3://127.0.0.1:7001</prop>   
		 <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop>   
	    </props>   
	</property>    
</bean>
 

相关推荐