Могу ли я установить уровень изоляции JDBC из контекста Tomcat? - PullRequest
3 голосов
/ 13 июля 2009

У меня есть веб-приложение, работающее в Tomcat 6, и мне удалось настроить его на использование встроенного пула соединений DBCP, и все работает очень хорошо, однако я подозреваю, что оно работает с неверным уровнем изоляции на база данных. Я хотел бы, чтобы он выполнялся в режиме чтения без передачи, но я думаю, что он работает в режиме чтения и не знаю, как его установить.

Вот файл XML моего контекста:

<?xml version="1.0" encoding="UTF-8"?>
    <Context antiResourceLocking="false" privileged="true">
        <Resource 
            name="jdbc/Connection" 
            auth="Container" 
            type="javax.sql.DataSource"
            maxActive="100" 
            maxIdle="30" 
            maxWait="10000"
            driverClassName="net.sourceforge.jtds.jdbc.Driver"
            url="jdbc:jtds:sqlserver://...etc..."
        />
    </Context>

И это метод Java, используемый для подключения к базе данных.

public Connection getDatabaseConnection() throws ServletException {
    try {
        InitialContext cxt = new InitialContext();
        if ( cxt == null ) {
            throw new ServletException( "ServletContext unavailable." );
        }

        DataSource ds = (DataSource)cxt.lookup( "java:/comp/env/jdbc/Connection" );
        if ( ds == null ) {
            throw new ServletException( "Data source not found!" );
        }

        Connection conn = ds.getConnection();
        return conn;
    } etc...

Получив соединение в getDatabaseConnection(), я понимаю, что могу вручную установить уровень изоляции с помощью conn.setIsolationLevel( Connection.TRANSACTION_READ_UNCOMMITTED ), но это неправильно, так как это связано либо с жестким кодированием уровня изоляции в Java, либо с поиском контекст сервлета каждый раз, когда требуется новое соединение.

Могу ли я как-то определить это в контексте XML или есть лучший подход, о котором я не знаю?

Ответы [ 2 ]

10 голосов
/ 15 июля 2009

Да, вы можете установить это с атрибутом defaultTransactionIsolation в элементе Resource.

<Context antiResourceLocking="false" privileged="true">
        <Resource 
            defaultTransactionIsolation="READ_UNCOMMITTED"
            name="jdbc/Connection" 
            auth="Container" 
            type="javax.sql.DataSource"
            maxActive="100" 
            maxIdle="30" 
            maxWait="10000"
            driverClassName="net.sourceforge.jtds.jdbc.Driver"
            url="jdbc:jtds:sqlserver://...etc..."
        />

Из документов:

defaultTransactionIsolation ¨

Состояние транзакции изоляции соединения, созданные этим пулом. Один из следующего: (см. Javadoc)

  • NONE
  • READ_COMMITTED
  • READ_UNCOMMITTED
  • REPEATABLE_READ
  • SERIALIZABLE
0 голосов
/ 20 июля 2016

Я искал уровень изоляции снимка. Параметр, который был правильно сообщен сервером базы данных, был

defaultTransactionIsolation="4096"

Вы можете подтвердить запрос к sys.dm_exec_sessions, который должен сообщить об отсутствии транзакции_5: 5. Надеюсь, это кому-нибудь поможет.

...