можно использовать пул соединений Hibernate и Tomcat одновременно? - PullRequest
5 голосов
/ 22 июля 2009

Я занимаюсь разработкой веб-приложения java и использую пул соединений Tomcat, вот мои настройки:

<?xml version="1.0" encoding="UTF-8"?>
<Context path="" docBase="" debug="5" reloadable="true" crossContext="true">
<Resource name="jdbc/jdbcPool"
            auth="Container"
            type="javax.sql.DataSource"
            maxActive="100"
            maxIdle="30"
            maxWait="10000"
            username="root"
            password="*******"
            driverClassName="com.mysql.jdbc.Driver"
            url="jdbc:mysql://localhost:3306/dbname?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>            
</Context>

и мой DAO:

 public static Connection dbConnection() throws NamingException {
        Context initContext;
        DataSource ds = null;
        Connection conn = null;
        try {
            initContext = new InitialContext();
            Context envContext = (Context) initContext.lookup("java:/comp/env");
            ds = (DataSource) envContext.lookup("jdbc/jdbcPool");
            conn = ds.getConnection();        
        }catch (SQLException ex){
            logger.error("SQLException Occurred in DAO.dbConnection() Method, Exception Message is: " + ex.getMessage(), ex);
        }
        catch (RuntimeException er){
            logger.fatal("SQLException Occurred in DAO.dbConnection() Method, Exception Message is: " + er.getMessage(), er);
        }catch(Exception rt){
           logger.fatal("Exception Occurred in DAO.dbConnection() Method, Exception Message is: " + er.getMessage(), er);
        }
        return conn;
    }

Я хочу использовать hibernate, поэтому я реорганизую некоторую часть своего кода, теперь я хочу знать, возможно ли для меня использовать их оба в моем приложении (я имею в виду, что некоторая часть моего кода использует hibernate, а другая часть использует мой DAO связь?) Если да, что будет с теми таблицами, которые не сопоставлены с hibernate, но некоторые сопоставленные таблицы имеют с ними связь?

Ответы [ 2 ]

3 голосов
/ 22 июля 2009

Полагаю, вы можете использовать их вместе, но зачем вам? Вместо этого вы можете настроить Hibernate на использование своего источника данных, как описано в руководстве . Это было бы что-то вроде:

hibernate.connection.datasource = java:/comp/env/jdbc/jdbcPool
hibernate.dialect = org.hibernate.dialect.MySQLDialect

Что касается сопоставлений, то "сопоставленные" таблицы могут иметь отношения к "не отображенным" таблицам (в базе данных), но эти отношения также будут "не сопоставленными" (например, Hibernate не будет их знать). Поэтому, если вы идете по этому пути, вы должны быть уверены, что не вызовете проблем со ссылочной целостностью при попытке, скажем, вставить / обновить «сопоставленную» сущность.

2 голосов
/ 22 июля 2009

Мое личное предпочтение в hibernate - не настраивать его с пулом соединений вообще. Это можно сделать, просто опустив настройки пула соединений в нашей конфигурации гибернации и используя метод openSession (Connection):

Connection conn = ... // get from jndi
Session session = sessionFactory.openSession(connection);
try{
   //do some work with either hte connection or the session or both
}finally{
   session.close();
   conn.close();
}

Преимущество этого заключается в том, что вы контролируете, какое соединение используется и где оно размещено, и, что наиболее важно, где оно закрыто, это может быть важно, если вы выполняете транзакцию с использованием кода hibernate и jdbc.

РЕДАКТИРОВАТЬ: @ ChssPly76 указывает на исключение встроенного управления транзакциями в hibernates, и он совершенно прав, hibernate обеспечивает разумную поддержку транзакций и, если данный JTA будет синхронизироваться с любой выполняющейся транзакцией. В JTA-приложении, в котором требуется, чтобы код hibernate и jdbc работали в одной и той же транзакции jdbc, важно убедиться, что сеанс hibernate использует то же соединение, что и код jdbc, лучший способ сделать это - дать Подключение к фабрике сессий. Обратите внимание, что это не исключает использование объекта транзакции Hibernate:

Connection conn = ... // get from jndi
Session session = sessionFactory.openSession(connection);
try{
   Transaction tx = new Transaction(); // 
   //do some work with either hte connection or the session or both
   tx.commit();
}finally{
   session.close();
   conn.close();
}

все будет работать нормально.

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