JNDI数据库连接池
PHP事实上是没有真正意义上的连接池的。在使用传统的PHP API时,Quercus也不例外。为了利用JDBC连接池,有如下选择:
(1)使用DBCP等Java连接池,但是这样必须在PHP代码中使用import语句。
(2)编写一个Java DAO,然后暴露给Quercus,但这样调试、修改都不方便。
(3)使用JNDI配合PDO。
第三种方法和Native PHP的PDO行为最为接近,且不需要在代码中显式配置。将来如果换用Native PHP,仅更改连接字符串即可。
首先需要在Tomcat的context.xml中添加如下配置:
<Context>
...
<Resource name="jndischool" auth="Container" type="javax.sql.DataSource"
maxActive="100" minIdle="10" maxWait="10000" initialSize="10"
username="dba" password="123456" driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://127.0.0.1:5432/school" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
validationQuery="SELECT 1" validationInterval="30000"
timeBetweenEvictionRunsMillis="30000" removeAbandonedTimeout="60"
removeAbandoned="true" logAbandoned="true" minEvictableIdleTimeMillis="30000"
jmxEnabled="true" jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer" />
...
</Context>
然后在应用的web.xml下添加配置如下:
<web-app>
...
<resource-ref>
<description>Datasource of school.</description>
<res-ref-name>jndischool</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
此时即可在Quercus中使用这个数据源,Tomcat的JNDI数据源格式为java:comp/env/jndiname。
$connectionString = "java:comp/env/jndischool";
$conn = new PDO($connectionString);
...