当前位置: 首页 > 面试题库 >

使用MySQL进行JDBC连接池的Jetty时,JNDI查找失败?

夹谷辰沛
2023-03-14
问题内容

我正在使用带有标准MySQL连接器API的Jetty 9.2(嵌入式),并且对应该如何设置它感到非常困惑。目前,我的 web.xml
文件中包含以下内容:

<webapp ...

    <resource-ref>
        <description>JDBC Data Source</description>
        <res-ref-name>jdbc/DataSource</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>
</webapp>

…这在我的jetty-env.xml中:

<Configure class="org.eclipse.jetty.webapp.WebAppContext">

   <New id="DatabaseConnector" class="org.eclipse.jetty.plus.jndi.Resource">
        <Arg></Arg>
        <Arg>jdbc/DataSource</Arg>
        <Arg>
            <New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
                <Set name="Url">jdbc:mysql://localhost:3306/DBName</Set>
                <Set name="User">user</Set>
                <Set name="Password">pass</Set>
            </New>
        </Arg>
    </New>

 </Configure>

…然后执行以下代码初始化:

Context envCtx = (Context) new InitialContext().lookup("java:comp/env");
DataSource datasource = (DataSource) envCtx.lookup("jdbc/DataSource");

当我尝试启动服务器时,出现错误javax.naming.NameNotFoundException; remaining name 'jdbc/DataSource'。我已经在代码初始化中尝试了许多不同的字符串变体,例如删除了lookupInitialContext对象的调用,但是我只是不断地获得相同错误的变体,只是name值不同。

这两个xml文件都位于我的/WAR/WEB-INF目录中。我查看了以前的问题和教程,博客等的大量内容,但是却一无所获。


问题答案:

这是嵌入式Jetty特有的问题的组合。

首先,在我实际启动Web服务器之前(即在调用之前),正在配置和启动Web服务器的启动器代码正在执行JNDI查找server.start(),因此在该阶段未初始化JNDI配置。

但是,即使进行此更改也不起作用,因为envCtx.lookup("jdbc/DataSource")需要从与WebApp关联的线程中进行调用。因此,我将该代码移到了静态块,该静态块在Web服务器请求首次请求数据库连接时被调用。

最后,我在 启动器代码中得到了以下内容

public static void main(String[] args) {
    Server server = new Server();

    //Enable parsing of jndi-related parts of web.xml and jetty-env.xml
    ClassList classlist = ClassList.setServerDefault(server);
    classlist.addAfter(
            "org.eclipse.jetty.webapp.FragmentConfiguration", 
            "org.eclipse.jetty.plus.webapp.EnvConfiguration", 
            "org.eclipse.jetty.plus.webapp.PlusConfiguration");
...
...
server.start();

无法通过该主线程进行JNDI查找,因此将其放置在类似于initservlet请求的方法的地方,或者像我一样,将其放置在servlet使用的静态数据库访问器类的同步方法中,例如

public class DatabaseUtils {

    private static DataSource datasource;

    private static synchronized Connection getDBConnection() throws SQLException {
        if (datasource == null) {
            initDataSource();
        }
        return datasource.getConnection();
    }

    public static void initDataSource() {
        try {
             datasource = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/DataSource");
             LOG.info("Database connection pool initalized successfully");
        } catch (Exception e) {
            LOG.error("Error while initialising the database connection pool", e);
        }
    }


 类似资料:
  • 我需要知道我对上面的理解是否正确。 在连接池中,可以使用java.sql.DataSource设置多个连接。 在jdbc中,我们直接指定连接url和oracle.jdbc.driver.OracleDriver并且它总是一个连接,另一个请求必须等待到连接完成处理。 使用JNDI与直接jdbc类似,我们通过名称引用jdbc设置,这样我们就可以在应用服务器中指定连接url和其他设置,而不是将它们绑定到

  • 我已经搜索了很长一段时间,但我找不到任何关于这个问题的好教程或答案。 在这个项目中,只有一个XML文件pom。该服务器是一个嵌入式Jetty 8,带有一个编程定义的ServletContextHandler,用于处理所有传入请求。我的观点是,没有WebAppContext或WAR文件(因为似乎所有教程都需要WEB-INF、WebAppContext、WEB.xml、jetty-env.xml或WA

  • 我正在使用嵌入式Jetty 9.2,并试图设置一个需要通过JNDI访问的Oracle数据源。我相信我已经正确地设置了这个,但是它不起作用,尽管花了一天的大部分时间在网上搜索。有人能帮忙吗? 以下是我的启动代码: 这是我的jetty-env.xml(在我的战争的WEB-INF目录中): 这是我的web.xml参考资料: 我得到两个错误。当我启动服务器时,我得到 JAVAlang.IllegalSta

  • 我将在应用程序中使用tomcat-jdbc连接池。有两种方法可以添加它: 谢了。

  • 问题内容: 只是从github交叉发布。 我将xorm 0.4.3与go-mysql一起使用。我们使用Golang 1.4。 我们在和中指定了以下内容: 而且我们使用相同的单个实例来查询Mysql。 但是我们仍然看到很多连接的状态,这是远远超过这些数字我已经配置和 我们国家的时候- 我们还观察到,即使我们停止MySQL,连接号仍保持固定但处于状态。如果我们关闭应用程序,则所有连接都会消失。 但是在

  • 我们使用spring数据中的Oracle AQ支持在同一数据源上同时使用JMS和JDBC,使用本地事务而不是XA。我们的设置基本上是参考手册中所描述的:在orcl上:aq jms连接工厂:使用本地数据源事务=“true”和本机jdbc提取器=“oracleNativeJdbcExtractor”HibernateTransactionManager(我现在正尝试对aq和Hibernate使用单一数