为什么JBoss会在出错时破坏连接池?

时间:2015-03-27 14:36:29

标签: java sql-server jboss

我在JBoss 4.2.3上运行的Web应用程序通过JTDS 1.2.2驱动程序连接到SQL Server 2008 R2数据库。数据源设置为池中至少有10个连接。这是ds文件jtds-ds.xml :(我已经替换了真正的jndi名称,服务器名称,数据库名称,用户名和密码)。

<datasources>
    <local-tx-datasource>
        <jndi-name>MyDS</jndi-name>
        <connection-url>jdbc:jtds:sqlserver://MyServer/MyDatabase;tds=8.0;lastupdatecount=true</connection-url>
        <driver-class>net.sourceforge.jtds.jdbc.Driver</driver-class>
        <user-name>MyUserName</user-name>
        <password>MyPassword</password>

        <set-tx-query-timeout>true</set-tx-query-timeout>

       <!--
            sql to call on an existing pooled connection when it is obtained from pool
        -->
        <check-valid-connection-sql>SELECT 1</check-valid-connection-sql>    

        <!-- Pooling Parameters -->
        <prepared-statement-cache-size>500</prepared-statement-cache-size> 
        <min-pool-size>10</min-pool-size> 
        <max-pool-size>40000</max-pool-size>
    </local-tx-datasource>
</datasources>

我运行 SQL Server Profiler 。在 SQL Server Profiler 中启动JBoss之后,我可以从Web应用程序中看到与MyDatabase数据库的10个数据库连接。每当任何用户在Web应用程序上工作时,我都可以在 SQL Server Profiler 中看到它。一切都很好看。

我启动一个进程非常漫长,并在数据库中插入数百万行。该进程一次插入1000行,即它从池中获取连接,在数据库中插入1000行,然后关闭连接。我可以在 SQL Server Profiler 中看到它并且它正常工作。

当进程正在运行时,我在日志文件中收到警告,我认为这是因为连接丢失到数据库服务器

2015-03-26 11:50:35,611 WARN  [org.jboss.resource.connectionmanager.JBossManagedConnectionPool] Unable to fill pool 
org.jboss.resource.JBossResourceException: Could not create connection; - nested throwable: (java.sql.SQLException: Network error IOException: Connection timed out: connect)
    at org.jboss.resource.adapter.jdbc.local.LocalManagedConnectionFactory.createManagedConnection(LocalManagedConnectionFactory.java:190)
    at org.jboss.resource.connectionmanager.InternalManagedConnectionPool.createConnectionEventListener(InternalManagedConnectionPool.java:619)
    at org.jboss.resource.connectionmanager.InternalManagedConnectionPool.fillToMin(InternalManagedConnectionPool.java:534)
    at org.jboss.resource.connectionmanager.PoolFiller.run(PoolFiller.java:74)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.sql.SQLException: Network ` IOException: Connection timed out: connect
    at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:385)
    at net.sourceforge.jtds.jdbc.ConnectionJDBC3.<init>(ConnectionJDBC3.java:50)
    at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:182)
    at org.jboss.resource.adapter.jdbc.local.LocalManagedConnectionFactory.createManagedConnection(LocalManagedConnectionFactory.java:172)
    ... 4 more
Caused by: java.net.ConnectException: Connection timed out: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
    at java.net.Socket.connect(Socket.java:529)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at net.sourceforge.jtds.jdbc.SharedSocket.createSocketForJDBC3(SharedSocket.java:304)
    at net.sourceforge.jtds.jdbc.SharedSocket.<init>(SharedSocket.java:255)
    at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:310)
    ... 7 more

发生此错误后, SQL Server Profiler 未显示Web应用程序的任何连接。 JBoss仍然在运行。在这种情况下,为什么JBoss会破坏它的连接池?

UPDATE:

当其他用户的请求进入Web应用程序时,我看到 SQL Server Profiler 通过Web应用程序显示了4个连接。所以它至少会再次开始构建连接池,尽管我希望它能显示10个连接。

我的问题仍然是当发生这样的错误(连接超时)时,为什么JBoss会丢弃连接池中的整个10个连接?该进程仅使用1个连接,其他9个连接未被使用,因为在运行该进程时没有其他人使用Web应用程序。当它以某种方式被破坏时,JBoss也可以自己重建它的连接池吗?我认为check-valid-connection-sql标签可以解决这个问题吗?

0 个答案:

没有答案