2009-07-13 7 views
3

J'ai une application web fonctionnant dans Tomcat 6, et j'ai réussi à la configurer pour utiliser le pool de connexions DBCP intégré, et tout fonctionne très bien, mais je suppose qu'il fonctionne dans le mauvais niveau d'isolation sur le base de données. Je voudrais qu'il s'exécute en lecture non validée, mais je pense qu'il s'exécute en lecture et ne sait pas comment le définir.Puis-je définir le niveau d'isolement JDBC à partir d'un contexte Tomcat?

Voici le fichier XML de mon contexte:

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

Et ceci est la méthode Java utilisée pour obtenir une connexion de base de données.

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

Après avoir obtenu la connexion en getDatabaseConnection() je me rends compte que je pouvais régler manuellement le niveau d'isolation avec conn.setIsolationLevel(Connection.TRANSACTION_READ_UNCOMMITTED) mais qui se sent mal qu'il soit implique coder en dur le niveau d'isolation dans Java, ou d'effectuer une consultation à la contexte de servlet chaque fois qu'une nouvelle connexion est requise. Puis-je définir cela dans le contexte XML d'une façon ou d'une autre, ou y a-t-il une meilleure approche que je ne connais pas?

Répondre

10

Oui, vous pouvez définir cela avec l'attribut defaultTransactionIsolation dans l'élément 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..." 
     /> 

De la documentation:

defaultTransactionIsolation ¨

état TransactionIsolation des connexions créées par ce pool. Un des éléments suivants: (voir javadoc)

  • AUCUN
  • READ_COMMITTED
  • READ_UNCOMMITTED
  • REPEATABLE_READ
  • SERIALIZABLE
0

Je cherchais le niveau d'isolement de capture instantanée. Le paramètre qui a été rapporté correctement par le serveur de base de données a été

defaultTransactionIsolation="4096"

Vous pouvez confirmer par une requête à sys.dm_exec_sessions qui devrait faire rapport transaction_isolation_level = 5. espère que cela aide quelqu'un.