我正在为 Apache Tomcat 7开发一个自定义Valve ,该 Valve 是在 Apache Tomcat server.xml配置文件中的主机容器级别定义的。
<Engine defaultHost="localhost" name="Catalina">
<Realm className="org.apache.catalina.realm.DataSourceRealm" dataSourceName="jdbc/qgw"
roleNameCol="role_name" userCredCol="user_pass" userNameCol="user_name" userRoleTable="user_roles" userTable="users"/>
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
<Valve className="org.mycompany.valves.CustomValve"/>
<Valve className="org.apache.catalina.authenticator.SingleSignOn"/>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log." suffix=".txt"/>
</Host>
</Engine>
阀门需要连接到数据库才能进行一些查询。
我正在尝试将 JNDI 资源定义为GlobalNamingResources中的全局资源。
<GlobalNamingResources>
<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver"
logAbandoned="true" maxActive="25" maxIdle="10" name="jdbc/qgw"
password="pass" removeAbandoned="true" removeAbandonedTimeout="300"
testOnBorrow="true" type="javax.sql.DataSource"
url="jdbc:mysql://localhost/qgw?autoReconnect=true"
username="username" validationQuery="SELECT 1"/>
</GlobalNamingResources>
问题是,资源只能在Context容器级别访问,因为在 context.xml 配置文件中定义了ResourceLink 。
<ResourceLink global="jdbc/qgw" name="jdbc/qgw" type="javax.sql.DataSource"/>
显然,当阀门试图通过 JNDI 获取数据源时
InitialContext initCtx = new InitialContext();
DataSource ds = (DataSource)initCtx.lookup("java:comp/env/jdbc/qgw");
获得 NameNotFoundException
javax.naming.NameNotFoundException: Name comp/env/jdbc/qgw is not bound in this Context
那么,有没有办法在 Host Container 级别使用资源来连接到定义的数据库呢?