所以我最近的一些项目都是采用这种架构,但是这种方式有一些不足的就是当应用服务器配置了多个应用,而这些应用使用同一个数据库,这就会导致不必要的资源浪费,也就是同一个应用服务器中存在针对同一个数据库的多个连接池。
也就是说我们希望每个应用服务器只有一个连接池的实例,在这个应用服务器上运行的所有项目都可以使用这个连接池,下面介绍这种方式在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> |