jetty mysql 数据库连接池
Posted
技术标签:
【中文标题】jetty mysql 数据库连接池【英文标题】:jetty mysql database connection pooling 【发布时间】:2012-08-03 19:14:31 【问题描述】:我正在尝试做一些看似简单的事情:设置一个小型数据库连接池,以便 servlet(只是一个)不会以每秒 1 个连接的速度创建我的服务器。
在Ubuntu 10.04
上,通过最新的升级/更新,我正在使用Eclipse Jetty 8.1.5.v20120716
。我正在尝试连接到mysql 5.1
服务器。
我的 servlet 被称为 gcm
,所以在 $jetty/contexts
中,我有这个 gcm.xml
文件:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
<Configure id="wac" class="org.eclipse.jetty.webapp.WebAppContext">
<New id="jdbc/myds" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg></Arg>
<Arg>jdbc/myds</Arg>
<Arg>
<New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
<Set name="Url">jdbc:mysql://localhost:3306/chat</Set>
<Set name="User">root</Set>
<Set name="Password">sillyness</Set>
</New>
</Arg>
</New>
<Set name="contextPath">/</Set>
<Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/gcm</Set>
<Set name="extractWAR">true</Set>
</Configure>
当我使用 java -jar start.jar -port=8080
启动 Jetty 时,一切都开始正常,直到我尝试从我的 servlet 访问数据库。请求的代码处理部分如下所示:
public static List<String> getDevices()
throws javax.naming.NamingException, java.sql.SQLException
synchronized (regIds)
InitialContext ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/myds");
Connection conn = null;
Statement stmt = null;
try
conn = ds.getConnection();
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from chatdevice");
//blah,blah,blah...
我得到的错误是:
javax.naming.NameNotFoundException; remaining name 'jdbc/myds'
at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:500)
at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:531)
at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:531)
at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:546)
at org.eclipse.jetty.jndi.java.javaRootURLContext.lookup(javaRootURLContext.java:112)
at javax.naming.InitialContext.lookup(InitialContext.java:409)
at com.google.android.gcm.demo.server.Datastore.getDevices(Datastore.java:98)
如何让Jetty找到数据库代码?
【问题讨论】:
【参考方案1】:就我而言,我去了码头邮件列表 (https://dev.eclipse.org/mailman/listinfo/jetty-users) 来问我的问题。
一个非常聪明的人(你好 Jan!)这样写和回答:
通常有许多不同的方法可以实现相同的结果 码头,所以这可能就是您看到不同方式记录的原因。 通常有选择是一件好事
如果有任何混淆,这是最终页面: http://wiki.eclipse.org/Jetty/Feature/JNDI如果有事 缺少,那么请告诉我们,以便我们更新页面。
您使用的情况有点不寻常 javaee 风格的功能,但没有 web.xml。这不是什么 我以前遇到过,但这听起来像是我应该添加的东西 文档。
我会建议(就像上面的页面一样)你把任何 jndi 定义到 WEB-INF/jetty-env.xml 文件中,不是上下文 xml 文件。如果你这样做,那么你可以有效地做一个 web.xml 元素会做并将您的数据源绑定到 java:comp/env 命名空间,通过定义您的资源并将其绑定到 java:comp/env 一次性完成(注意这将不在上下文中工作 xml 文件,它必须是 jetty-env.xml):
所以在 WEB-INF/jetty-env.xml 中执行以下操作:
<New id="jdbc/myds" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg></Arg>
<Arg>jdbc/myds</Arg>
<Arg>
<New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
<Set name="Url">jdbc:mysql://localhost:3306/chat</Set>
<Set name="User">root</Set>
<Set name="Password">sillyness</Set>
</New>
</Arg>
<Call name="bindToENC">
<Arg>jdbc/myds</Arg>
</Call>
</New>
在对 bindToENC 的调用中,绑定您想要查找的任何名称作为 java:comp/env 的后缀。例如,如果你想查找 java:comp/env/my/foo 那么 bindToENC 参数将是“my/foo”。
-- Jan Bartel www.webtide.com – 来自 Jetty 和 CometD 专家的开发人员建议、服务和支持。 _________________________________________________________ jetty-users 邮件列表 jetty-users@eclipse.org https://dev.eclipse.org/mailman/listinfo/jetty-users
现在,这还不够(我是码头新手)。提到的WEB-INF就是我的servlet的war文件里面的WEB-INF……所以我把war文件的内容解压到一个目录下,然后就可以轻松的把jetty-env.xml文件放到WEB中了-INF 目录。
这也很关键:
好的,我假设在那里有一点码头知识,并认为你会知道 我发布的只是你需要的一个 sn-p 获取完整的 jetty-env.xml 文件。
jetty-env.xml 文件的 wiki 页面在这里: http://wiki.eclipse.org/Jetty/Reference/jetty-env.xml
因此,将根元素包装在该页面上的 sn-p I 周围 发布,你应该很好。
现在 /that/ 得到了要尝试的数据库连接。然后我在 /var/log/auth.log 中收到 connection refused from 127.0.0.1
错误。
原来我运行了denyhosts,果然有人在里面放了ALL: 127.0.0.1
...这意味着与我的本地计算机的连接被拒绝了。
一旦修复了这个细节,servlet 终于可以访问我服务器上的 MySQL。
【讨论】:
【参考方案2】:尝试将其添加到 web.xml
<resource-ref>
<res-ref-name>jdbc/myds</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
【讨论】:
嗨 Sumit,感谢您的回答,但如果我将其放入名为“web.xml”的文件中,或者我的 gcm.xml 文件中的任何位置,我会被告知“无法达到节点目标:已启动”和“未知配置类型:以上是关于jetty mysql 数据库连接池的主要内容,如果未能解决你的问题,请参考以下文章
带有 DataSource 的 jetty-env.xml 导致 mvn jetty:run 上的 WebAppContext 失败