2009-07-13 26 views
3

我有一个在Tomcat 6中运行的Web应用程序,我已经设法配置它使用内置的DBCP连接池,并且所有工作都很好,但是我怀疑它运行在错误的隔离级别数据库。我希望它在读取未运行的情况下运行,但我认为它在读取提交时运行,不知道如何设置它。我可以从Tomcat上下文中设置JDBC隔离级别吗?

这里是我的上下文的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,或执行查找到每次需要新的连接时都要使用servlet上下文。

我可以在上下文XML中以某种方式定义这个,还是有更好的方法,我不知道?

回答

10

是的,您可以使用Resource元素中的defaultTransactionIsolation属性进行设置。

<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¨

由该池中创建 连接TransactionIsolation状态。一个 如下:(见的javadoc)

  • NONE
  • READ_COMMITTED
  • READ_UNCOMMITTED
  • REPEATABLE_READ
  • SERIALIZABLE
0

我一直在寻找的快照隔离级别。这是由数据库服务器报告正确的设置是

defaultTransactionIsolation="4096"

您可以通过查询sys.dm_exec_sessions应报告transaction_isolation_level = 5,希望它可以帮助别人确认。

相关问题