`
SimonLei
  • 浏览: 174097 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SmartGwtEE 之 SqlDataSource 的连接池

 
阅读更多

有个项目,使用了SmartGwtEE,并且直接采用了SmartGwtEE所提供的SqlDataSource。

这样做的好处是可以利用它提供的 admin console 和 develop tools来直接定义ds.xml文件,

只要事先做好数据库的设计,就很容易的自动生成所需要的ds.xml。

 

开发都没问题,到要部署的时候,做了一下压力测试,麻烦就来了。似乎缺省的配置里面,

SqlDataSource就不使用连接池。虽然搜了一下smartgwt的论坛,它里面是说应该是自带了

连接池,但是最大连接数什么的没法设置。

 

现象就是,在pl/sql里面查询 v$session,发现来自那个应用服务器的连接数,最开始是5个,看起来

像是有连接池的样子,但是只要有人访问它,连接数就变成0。而且,经常发生变化,通过netstat -an

在应用服务器上看,也是看到了一堆的 1521连接,都处于TIME_WAIT状态。因此,判断还是由于

连接池没有起到作用。

 

重新用smartgwtee提供的datasource admin console,定义的时候是可以选择使用连接池的,

相应的server.properties也修改了,但是就是不起作用,经常是无法建立连接,报错

 

Io 异常: The Network Adapter could not establish the connection

 

从smartgwt论坛里面看到不少的人都有这样的问题,但是按照他们提供的办法都没有解决。

于是,考虑使用 jndi,而不是直接用DriverManager来访问数据库,毕竟在jndi定义的时候,

连接池的大小还是比较容易控制的。

 

应用服务器使用的是jetty,所以定义jndi比较容易。在WEB-INF下新建一个jetty-web.xml文件,里面

 

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">

<Configure class="org.mortbay.jetty.webapp.WebAppContext">

 <New id="db" class="org.mortbay.jetty.plus.naming.Resource">
 <Arg></Arg>
    <Arg>jdbc/db</Arg>
    <Arg>
     <New class="org.apache.commons.dbcp.BasicDataSource">
     	<Set name="driverClassName">oracle.jdbc.driver.OracleDriver</Set>
                 <Set name="url">jdbc:oracle:thin:@192.168.0.10:1521:sid</Set>
                 <Set name="username">***</Set>
                 <Set name="password">***</Set>
		   <Set name="initialSize">5</Set>
		   <Set name="maxActive">50</Set>
		   <Set name="maxIdle">10</Set>
		   <Set name="minIdle">3</Set>
		   <Set name="maxWait">60000</Set>
     </New>
    </Arg>
   </New>
</Configure>
 

然后修改server.properties,设置为

 

sql.db.pool.enabled: true

sql.db.autoJoinTransactions: true

sql.db.interface.type: jndi

sql.db.database.type: oracle

sql.db.driver.name: jdbc/db

sql.db.driver.driverType: thin

sql.db.interface.credentialsInURL: true


然而,还是很不幸的发生了一个dbcp pool 与oracle不兼容的问题:

 

java.sql.SQLException: Already closed.

 

查了一下,觉得可能是版本不兼容,于是把commons-dbcp从1.2.2换成了1.4,感觉问题都解决了。

但是一上压力测试,发现连接数不够了,加的再大也不够,感觉就是所有的连接都没有释放。然后想了

一下,应该是jndi这里已经是个池了,但是我在server.properties里面又定义了 sql.db.pool.enabled: true

于是smartgwtee本身就不释放连接,于是在jndi那里,连接就都没关闭,于是将这一行修改为

 

sql.db.pool.enabled: false

 

终于一切都ok了,上100个并发感觉也还正常,总算解决了。

0
0
分享到:
评论
2 楼 SimonLei 2013-07-08  
SmartGwtEE 是要钱的,不过有试用版。
1 楼 a137268431 2013-07-07  
弱弱的问下SmartGWTEE,用花钱吗?是不是 直接可以用 还是 有什么特殊的jar包,还是得花钱买吗?
直接用smartgwt的jar包是不是不好使。。。
请大神 回答下

相关推荐

Global site tag (gtag.js) - Google Analytics