spring 连接池 ,ibatis连接关闭问题

LEE-MCICI 2010-10-29 06:08:05
今天看了下东西有些不解了。
项目中用到了spring + ibatis的搭配。
spring使用了proxool的连接池技术。
里面配置了说要至少有多少连接啥的。大体是这个样子的。我又几个问题:



1 看了下ibatis中的源码,里面每完成一个事务,就直接connection.close(); connection = null;
这个是物理关闭还是啥?

2 啥是物理关闭?看到说连接池不会进行物理关闭,只是回收了。。。。

3 既然spring使用了连接池,不会进行物理关闭,那样很影响效率,但ibatis中的是吗,如果是
那用一个关一个,岂不一直在建物理连接??

非常感谢,看了一些资料,有些乱,请明白人给点指导。
...全文
866 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
panhaichun 2010-10-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dr_lf 的回复:]
panhaichun:
麻烦给说详细下啊:如果没用连接池的话,ibatis就是真的物理关闭了,用了连接池的话就不是了。
这是怎么弄的里面
[/Quote]

用了连接池的话, 应用程序通过连接池取得的connection对象一般都是真正CONNECTION对象的一个代理,调用CONNECTION代理对象的CLOSE方法, 不会真的关闭数据库连接,只是重新放回池中.
lpl071403004 2010-10-30
  • 打赏
  • 举报
回复
来学习··
forever_ai 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wshsdlau 的回复:]
在Spring的"applicationContext.xml"中的dataSource bean定义——

<bean id="dataSource"
class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="driver">
<value>com.mysql.jdbc.Driver</va……
[/Quote]

学习一下
LEE-MCICI 2010-10-29
  • 打赏
  • 举报
回复
panhaichun:
麻烦给说详细下啊:如果没用连接池的话,ibatis就是真的物理关闭了,用了连接池的话就不是了。
这是怎么弄的里面
LEE-MCICI 2010-10-29
  • 打赏
  • 举报
回复
哦说错了,嘿嘿,如果关闭了会影响
wshsdlau 2010-10-29
  • 打赏
  • 举报
回复
在Spring的"applicationContext.xml"中的dataSource bean定义——

<bean id="dataSource"
class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="driver">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="driverUrl">
<value>jdbc:mysql://localhost:3306/dbname?user=yourname&password=yourpass</value>
</property>
<property name="user" value="yourname" />
<property name="password" value="yourpass" />
<property name="alias" value="Pool_dbname" />
<property name="houseKeepingSleepTime" value="90000" />
<property name="prototypeCount" value="0" />
<property name="maximumConnectionCount" value="50" />
<property name="minimumConnectionCount" value="2" />
<property name="simultaneousBuildThrottle" value="50" />
<property name="maximumConnectionLifetime" value="14400000" />
<property name="houseKeepingTestSql" value="select CURRENT_DATE" />
</bean>

第一种方式需要把用户名和密码写在连接串里面,
ProxoolDataSource类提供的user,password属性似乎没有什么用。
无论提供什么,它都会以空用户名、密码去连接数据库。
这可能是Proxool RC0.93的一个bug。
不过配置中的user,password两个属性还必须设置,否则hibernate会报空指针错误。

方式二:
在Spring的"applicationContext.xml"中的dataSource bean定义——
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>org.logicalcobwebs.proxool.ProxoolDriver</value>
</property>
<property name="url">
<value>proxool.Pool_dbname</value>
</property>
</bean>



第二种方式需要预先在"web.xml"先配置好Proxool连接池,配置如下:


<servlet>
<servlet-name>proxoolServletConfigurator</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>

<servlet>
<servlet-name>context</servlet-name>
<servlet-class>
org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>

注意,第二种方式下Spring的上下文加载如果想使用listener方式(Struts2要求),
则与连接池有关的Bean全得延迟初始化。因为listener比servlet优先初始化,
如果相关Bean不是lazy-init的话,则启动服务器时会出现Bean找不到连接定义的异常。

<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>


其中proxool的配置文件可以采用xmlFile"proxool.xml"或者propertyFile"proxool.properties"

"proxool.xml"格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<proxool-config>
<proxool>
<alias>Pool_dbname</alias>
<driver-url>jdbc:mysql://localhost:3306/dbname</driver-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<driver-properties>
<property name="user" value="yourname"/>
<property name="password" value="yourpass"/>
</driver-properties>
<house-keeping-sleep-time>60000</house-keeping-sleep-time>
<maximum-connection-count>20</maximum-connection-count> 
<minimum-connection-count>2</minimum-connection-count>
<prototype-count>0</prototype-count>
<simultaneous-build-throttle>20</simultaneous-build-throttle>
<house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
<statistics>15s,10m,1d</statistics>
<statistics-log-level>INFO</statistics-log-level>
</proxool>
<proxool>
<!--可以配置多个库-->
</proxool>
</proxool-config>


"proxool.properties"格式如下:
jdbc-0.proxool.alias=Pool_dbname
jdbc-0.proxool.driver-url=jdbc:mysql://localhost:3306/dbname
jdbc-0.proxool.driver-class=com.mysql.jdbc.Driver
jdbc-0.user=yourname
jdbc-0.password=yourpass
jdbc-0.proxool.house-keeping-sleep-time=60000
jdbc-0.proxool.house-keeping-test-sql=select CURRENT_DATE
jdbc-0.proxool.maximum-connection-count=10
jdbc-0.proxool.minimum-connection-count=3
jdbc-0.proxool.maximum-connection-lifetime=18000000
jdbc-0.proxool.prototype-count=3
jdbc-0.proxool.simultaneous-build-throttle=10
jdbc-0.proxool.recently-started-threshold=60000
jdbc-0.proxool.overload-without-refusal-lifetime=50000
jdbc-0.proxool.maximum-active-time=60000
jdbc-0.proxool.verbose=true
jdbc-0.proxool.trace=true
jdbc-0.proxool.fatal-sql-exception=Fatal error

jdbc-2.proxool.alias=Pool_dbname2
……
<!--可以配置多个库-->
同光和尘 2010-10-29
  • 打赏
  • 举报
回复
“既然spring使用了连接池,不会进行物理关闭,那样很影响效率,”这是什么意思?
magicluo 2010-10-29
  • 打赏
  • 举报
回复
连接池顾名思义 就是经过你的参数配置后

程序启动会自动产生一些数据库的connection 对象(这个数量由你在连接池的配置文件中配置)

然后会将这些连接保存在一个集合中..

close方法会被重写为 将连接返回到集合中 ..
macguan 2010-10-29
  • 打赏
  • 举报
回复
你的三个问题都混淆了JDBC connection和connection pool这两个概念,
关闭是JDBC连接(connection)关闭,不是池关闭.连接和池是两个概念.


panhaichun 2010-10-29
  • 打赏
  • 举报
回复
1.如果没用连接池的话,ibatis就是真的物理关闭了,用了连接池的话就不是了。

2.就是与数据库断开,从连接池中返回的connection调用close方法是不会真的关闭连接的

3.为什么说影响效率?

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧