使用全局數據庫連接池資源(轉載)
我們希望每個應用服務器只有一個連接池的實例,在這個應用服務器上運行的所有項目都可以使用這個連接池,下面介紹這種方式在Tomcat和Resin下的配置。
Tomcat使用JNDI Resource來配置各種資源,包括數據庫連接池。這些Resource有兩種運行范圍,第一個就是Context級別,也就是說Context特有的 Resource,該Resource只能被其所屬的Context訪問,顯然這不是我們所要的。
另外一種就是定義全局命名資源,然后在Context中進行引用,下面是一個配置的例子(server.xml):
<Server port="8005" shutdown="SHUTDOWN">
? <GlobalNamingResources>
? ?<!-- 全局有效的JDBC資源 -->
?<Resource name="jdbc/dlog" auth="Container" type="javax.sql.DataSource"
?????????????? maxActive="100" maxIdle="30" maxWait="10000" defaultTransactionIsolation="1" defaultAutoCommit="false"
?????????????? poolPreparedStatements="true" maxOpenPreparedStatements="1000" initialSize="1"
?????????????? username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
?????????????? url="jdbc:mysql://localhost:3306/dlogcn?autoReconnect=true"/>
? </GlobalNamingResources>
? <!-- Define the Tomcat Stand-Alone Service -->
? <Service name="Catalina">
??? <!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
??? <Connector port="8080" maxHttpHeaderSize="8192"
?????????????? maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
?????????????? enableLookups="false" redirectPort="8443" acceptCount="100"
?????????????? connectionTimeout="20000" disableUploadTimeout="true" />
???
??? <!-- Define the top level container in our container hierarchy -->
??? <Engine name="Catalina" defaultHost="localhost">
????? <Host name="localhost" appBase="webapps">
?<Context path="" docBase="C:\PROJECTS\JAVA\DLOG4J_V3\webapp" reloadable="true">
?? <!-- 在Context引用全局JDBC資源 -->
?? <ResourceLink name="jdbc/dlog" global="jdbc/dlog"/>
?</Context>
????? </Host>
?????
??? </Engine>
? </Service>
</Server>
相比較Tomcat來說,Resin更為簡單,在Resin2中連接池的配置如下
<caucho.com>
<http-server>
? <http port='80'/>
?
? <servlet-mapping url-pattern='*.xtp' servlet-name='xtp'/>
? <servlet-mapping url-pattern='*.jsp' servlet-name='jsp'/>
? <resource-ref res-ref-name="java:/comp/env/jdbc/dlog" res-type="javax.sql.DataSource">
??? <init-param driver-name="com.mysql.jdbc.Driver"/>
??? <init-param url="jdbc:mysql://localhost:3306/dlogcn?autoReconnect=true"/>
??? <init-param user="root"/>
??? <init-param password="moabc"/>
??? <init-param maxConnections="100"/>
? </resource-ref>
? <!-- default host if no other host matches -->
? <host id=''>
?
??? <web-app id='' app-dir='C:\PROJECTS\JAVA\DLOG4J_V3\webapp' />
?????
? </host>
</http-server>
</caucho.com>
你可以把這段配置放在web-app中,則該連接池只有對應的webapp才能訪問,放在<host>則,host中的所有web-app都可以訪問,放在<http-server>中,則整個resin的所有webapp都可以訪問。
(實驗過程中發現resin2的文檔有誤,如果res-ref-name寫為jdbc/dlog,則webapp怎么都找不到這個資源,改成java:/comp/env/jdbc/dlog即可。)
接下來我們就可以在應用中使用如下代碼來獲取連接池的DataSource實例
Context initContext = new InitialContext();
Context envContext? = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/dlog");
其他的應用服務器的配置可以按照這個思路參考它的手冊進行配置。應該說不管是采用何種方式,性能上不會有太大的區別,如何選擇就在于你整個服務器的項目結構。
另外從上面Tomcat和Resin的配置來看,盡管Resin的配置要簡單于Tomcat,但是靈活性和擴展性就相對要差一些。
posted on 2006-07-10 10:33 小熊泡泡 閱讀(503) 評論(1) 編輯 收藏 所屬分類: 數據庫