LINUX.ORG.RU

Hibernate: как поймать исключение?


0

0

Столкнулся с весьма странной для себя проблемой — не могу поймать 
исключение, генерируемое Hibernate.

Что делаю:

try
{
  sessions = new Configuration().configure().buildSessionFactory();
}
catch (Throwable ex)
{
  System.exit(0);
}

Смысл — хочу отловить ошибку при подключении к СУБД. Получается, что 
если СУБД не запущена, выдаётся следующее исключение:

24.03.2008 22:49:39 org.hibernate.cfg.Environment <clinit>
INFO: Hibernate 3.2.6
24.03.2008 22:49:39 org.hibernate.cfg.Environment <clinit>
INFO: hibernate.properties not found
24.03.2008 22:49:39 org.hibernate.cfg.Environment buildBytecodeProvider
INFO: Bytecode provider name : cglib
24.03.2008 22:49:39 org.hibernate.cfg.Environment <clinit>
INFO: using JDK 1.4 java.sql.Timestamp handling
24.03.2008 22:49:39 org.hibernate.cfg.Configuration configure
INFO: configuring from resource: /hibernate.cfg.xml
24.03.2008 22:49:39 org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: Configuration resource: /hibernate.cfg.xml
24.03.2008 22:49:39 org.hibernate.cfg.Configuration addResource
INFO: Reading mappings from resource : JTinyBroadcastLibrary/TemplateWeek.hbm.xml
24.03.2008 22:49:39 org.hibernate.cfg.HbmBinder bindRootPersistentClassCommonValues
INFO: Mapping class: JTinyBroadcastLibrary.TemplateWeek -> TEMPLATE_WEEK
24.03.2008 22:49:39 org.hibernate.cfg.Configuration doConfigure
INFO: Configured SessionFactory: null
24.03.2008 22:49:40 org.hibernate.connection.DriverManagerConnectionProvider configure
INFO: Using Hibernate built-in connection pool (not for production use!)
24.03.2008 22:49:40 org.hibernate.connection.DriverManagerConnectionProvider configure
INFO: Hibernate connection pool size: 1
24.03.2008 22:49:40 org.hibernate.connection.DriverManagerConnectionProvider configure
INFO: autocommit mode: false
24.03.2008 22:49:40 org.hibernate.connection.DriverManagerConnectionProvider configure
INFO: using driver: com.mysql.jdbc.Driver at URL: jdbc:mysql://localhost/db1
24.03.2008 22:49:40 org.hibernate.connection.DriverManagerConnectionProvider configure
INFO: connection properties: {useUnicode=yes, user=user, password=****, characterEncoding=utf8}
24.03.2008 22:49:40 org.hibernate.cfg.SettingsFactory buildSettings
WARNING: Could not obtain connection metadata
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION ** 

java.net.ConnectException
MESSAGE: В соединении отказано

STACKTRACE:

java.net.ConnectException: В соединении отказано
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
        at java.net.Socket.connect(Socket.java:519)
        at java.net.Socket.connect(Socket.java:469)
        at java.net.Socket.<init>(Socket.java:366)
        at java.net.Socket.<init>(Socket.java:208)
        at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256)
        at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:271)
        at com.mysql.jdbc.Connection.createNewIO(Connection.java:2744)
        at com.mysql.jdbc.Connection.<init>(Connection.java:1553)
        at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
        at java.sql.DriverManager.getConnection(DriverManager.java:582)
        at java.sql.DriverManager.getConnection(DriverManager.java:154)
        at org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverMa
nagerConnectionProvider.java:110)
        at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:84)
        at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2073)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1298)
        at jtinybroadcastadv.JTinyBroadcastAdvView.<init>(JTinyBroadcastAdvView.java:44)
        at jtinybroadcastadv.JTinyBroadcastAdvApp.startup(JTinyBroadcastAdvApp.java:19)
        at org.jdesktop.application.Application$1.run(Application.java:171)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:27
3)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:17
3)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)


** END NESTED EXCEPTION **


НО! Исключение не ловится. Т.е. программа продолжает работу. Если 
смотреть отладчиком, то блок catch пропускается и выполняются 
инструкции за ним. Я где-то так сильно заблуждаюсь?

P.S. Если СУБД запущена, но всё работает. Логично в принципе.
★★★★★

Немного дополнительной инфы: Java SE 6, использую встроенный
connection pool (может быть в этом проблема?). Конфиг hibernate ниже:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> ;

<hibernate-configuration>

<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost/db1</property>
<property name="connection.username">user</property>
<property name="connection.password">pass</property>
<property name="connection.useUnicode">yes</property>
<property name="connection.characterEncoding">utf8</property>

<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>

<!-- SQL dialect -->
<!--<property name="dialect">org.hibernate.dialect.MySQLDialect</property>-->
<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>

<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>

<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

<!-- Echo all executed SQL to stdout -->
<property name="show_sql">false</property>

<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">update</property>

<mapping resource="JTinyBroadcastLibrary/TemplateWeek.hbm.xml"/>

</session-factory>

</hibernate-configuration>

Ловить пробовал и просто Exception, и HibernateException и т.п...

roy ★★★★★
() автор топика

Честно говоря, не разбираюсь в Hibernate, но...

> НО! Исключение не ловится. Т.е. программа продолжает работу. Если смотреть отладчиком, то блок catch пропускается и выполняются инструкции за ним. Я где-то так сильно заблуждаюсь?

кажется это означает, что из buildSessionFactory() исключений не вылетает, ловится где-то внутри.

anonymous
()
Ответ на: комментарий от roy

System.exit может быть банально запрещен policy, если дело в сервлет-контейнере, например, происходит. Но тогда вылетало бы SecurityException.

svr69 ★★
()
Ответ на: комментарий от roy

Да, и просто Exception ловить без толку - HibernateException наследуется от RuntimeException. Но в принципе Throwable уж всяко должно покрывать.

svr69 ★★
()
Ответ на: комментарий от roy

А вообще попробуйте ловить исключение не на sessionFactory, а на session. В принципе для пула коннектов временное отсутствие подключения к базе не смертельно. Смертельна такая ситуация, когда коннект действительно нужен, т. е., в терминах Hibernate как раз SessionFactory.openSession()

svr69 ★★
()
Ответ на: комментарий от svr69

Я, в принципе, разобрался. Дело действительно было в том, что buildSession() исключение наверх не передаёт, а просто пишет в лог об этом, поэтому оно и не ловилось.

Ловлю исключение на операциях с Session — всё нормально, спасибо.

roy ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.