JTDS и JBOSS Пул соединений JDBC Проблема, любое решение? Может быть, пользовательский ValidConnectionChecker? - PullRequest
4 голосов
/ 03 сентября 2010

Я столкнулся со странной производственной проблемой.Среда выглядит следующим образом:

  • JBOSS 4.0.2
  • SQL Server 2005
  • Драйвер JTDS 1.2.5

Время от времени довремя выполнения следующего сценария.

Команде SQL не удается выполнить команду Excute с

 java.sql.SQLException: I/O Error: Read timed out 

(я могу с этим смириться, если это произойдет два раза в день или около того)

Но с этого момента соединение, похоже, теряется, и пул его не распознал, так как с этого момента я постоянно получаю

java.sql.SQLException: Invalid state, the Connection object is closed.

.Единственное, что помогает, это перезапуск JBOSS.Это происходит несмотря на тот факт, что в моем определении источника данных настроено

 <check-valid-connection-sql>select getdate()</check-valid-connection-sql>

.

Мне было интересно, могу ли я использовать пользовательский ValidConnectionChecker, который либо перестраивает само соединение, либоявно выдает исключение, чтобы исправить это.Может быть, у кого-то есть другие предложения.

Вот мое полное определение DS.

  <local-tx-datasource>
    <jndi-name>MyDS</jndi-name>
    <connection-url>jdbc:jtds:sqlserver://192.168.35.235:1433/MyDb;user=user1;password=pwd;appName=MyApp;loginTimeout=15;socketTimeout=120</connection-url>
    <driver-class>net.sourceforge.jtds.jdbc.Driver</driver-class>
    <user-name>user1</user-name>
    <password>pwd</password>
    <min-pool-size>10</min-pool-size>
    <max-pool-size>25</max-pool-size>
    <blocking-timeout-millis>60000</blocking-timeout-millis>
    <idle-timeout-minutes>1</idle-timeout-minutes>
    <check-valid-connection-sql>select getdate()</check-valid-connection-sql>
  </local-tx-datasource>

Любая помощь оценена.

С уважением

Ответы [ 3 ]

7 голосов
/ 21 октября 2010

Попробуйте изменить строку класса драйвера на net.sourceforge.jtds.jdbcx.JtdsDataSource.net.sourceforge.jtds.jdbc.Driver не реализует интерфейс javax.sql.ConnectionPoolDataSource.источник: http://jtds.sourceforge.net/faq.html#features

3 голосов
/ 02 сентября 2014

Возможно, слишком поздно решение, но я застрял здесь с драйвером jtds. Надеюсь, это сэкономит полчаса вашего продуктивного времени.

Исправление состоит в том, чтобы указать validationQuery для реализации пула соединений Apache dbcp2. Для сервера jtds / sql Я указал конфигурацию пружины следующим образом:

<bean id="sqlServerDS" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close" >
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <property name="defaultReadOnly" value="true" />
    <property name="validationQuery" value="select 1" />
</bean>

Если вы не используете Spring, вызовите метод setValidationQuery для BasicDataSource в своем Java-коде.

BasicDataSource bds = new BasicDataSource();
bds.setValidationQuery("select 1");
0 голосов
/ 06 октября 2010

Connection.isValid() не реализовано в JTDS. Я обнаружил, что даже перехват исключения и принудительный полный перезапуск соединения не работает.

...