Поймать недопустимую ошибку URL соединения hibernate - PullRequest
1 голос
/ 05 января 2010

Если я добавлю неправильный URL-адрес соединения в мой файл hibernate.cfg.xml, я хочу иметь возможность его обнаружить и завершить корректно, но не могу понять, как; он просто бесконечно зависает в buildSessionFactory () во время процедуры инициализации спящего режима:

SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory();

Он находится в блоке try, и я пытаюсь поймать универсальное исключение, но buildSessionFactory () никогда не выдает его, а просто зависает. Это элемент URL в моем hibernate.cfg.xml:

<property name="hibernate.connection.url">jdbc:mysql://123.123.123.123/mydb</property>

Моя система: Ubuntu 9.10 с Tomcat 5.5, Java 1.6, Hibernate 3 и MySQL 5.

Когда я сначала инициализирую hibernate, он просто зависает на 22 секунды, затем начинает выплевывать предупреждения о потоках и взаимоблокировке (начиная с этого):

15:16:25,758  WARN ThreadPoolAsynchronousRunner.class: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@a010ba -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
15:16:25,761  WARN ThreadPoolAsynchronousRunner.class: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@a010ba -- APPARENT DEADLOCK!!! Complete Status: 
Managed Threads: 3
Active Threads: 3
Active Tasks: 
    com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@109da93 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
    com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1ed1dbe (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
    com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@3bc1a1 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
Pending Tasks: 
    com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@12549c4
    com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@10df4e2
Pool thread stack traces:
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
    java.net.PlainSocketImpl.socketConnect(Native Method)
    java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
    java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
    java.net.Socket.connect(Socket.java:525)
    java.net.Socket.connect(Socket.java:475)
    java.net.Socket.<init>(Socket.java:372)
    java.net.Socket.<init>(Socket.java:215)
    com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:253)
    com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:284)
    com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2194)
    com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:723)
    com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46)
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
    com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302)
    com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282)
    com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:135)
    com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182)
    com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)
    com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137)
    com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)
    com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
    com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)

РЕДАКТИРОВАТЬ: вот мои свойства c3p0 из моего hibernate.cfg.xml

<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.idle_test_period">100</property>
<property name="hibernate.c3p0.max_size">100</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.timeout">100</property>

1 Ответ

0 голосов
/ 05 января 2010

Как упомянул BryanD в комментарии, buildSessionFactory() на самом деле не зависает, скорее всего, время потрачено на c3p0, который пытается восстановить соединение. Цитирование документации c3p0 :

Когда c3p0 DataSource пытается и не может установить соединение, он будет повторяться до acquireRetryAttempts раз с задержкой acquireRetryDelay между каждой попыткой. Если все попытки не удаются, все клиенты, ожидающие Соединения от источника данных, увидят Исключение, указывающее, что Соединение не может быть получено. Обратите внимание, что клиенты не видят никаких исключений, пока не завершится полный цикл попыток, что может произойти через некоторое время после первоначальной попытки подключения. Если acquireRetryAttempts установлено в 0, c3p0 будет пытаться получить новые Соединения на неопределенный срок, а вызовы на getConnection() могут блокировать на неопределенный срок в ожидании успешного получения.

Если вы не настроили его, значение по умолчанию acquireRetryAttempts равно 30, поэтому для возврата buildSessionFactory() может потребоваться некоторое время. Но, если вы не использовали значение, меньшее или равное нулю, в этом случае c3p0 будет продолжать пытаться извлекать соединение бесконечно, это будет продолжаться.

Может быть, вы могли бы использовать меньшее значение. Или, возможно, вы могли бы просто использовать правильный URL и перестать тратить время на исключительную ситуацию (ошибка конфигурации).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...