【问题标题】:JNDI connection pooling for a console program?控制台程序的 JNDI 连接池?
【发布时间】:2014-08-13 05:03:52
【问题描述】:

我正在尝试connect with a database connection pool:

thufir@dur:~$ 
thufir@dur:~$ java -jar NetBeansProjects/Dialer/dist/Dialer.jar 
hello world
Jun 23, 2014 1:04:39 AM net.bounceme.dur.Dialer <init>
INFO: {dur.reports.db.jndi.name=jdbc/vehicles, dur.db.jndi.name=jdbc/vehicles, dur.reports.db.type=MYSQL, reports.exportRawData=true, dur.db.type=MYSQL}
Jun 23, 2014 1:04:39 AM net.bounceme.dur.Dialer <init>
SEVERE: null
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:344)
    at javax.naming.InitialContext.lookup(InitialContext.java:411)
    at net.bounceme.dur.Connector.<init>(Connector.java:15)
    at net.bounceme.dur.Dialer.<init>(Dialer.java:19)
    at net.bounceme.dur.Dialer.main(Dialer.java:26)

thufir@dur:~$ 

我认为可以为控制台应用程序使用 JNDI 和连接池,而无需 Tomcat、Glassfish 或类似工具?

package net.bounceme.dur;

import java.sql.SQLException;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class Connector {


    public Connector(Properties props) throws NamingException, SQLException {
        InitialContext ctx = new InitialContext();
        //ctx.lookup(null); //????????
        DataSource ds = (DataSource) ctx.lookup(props.getProperty("dur.db.jndi.name"));
    }

}

或者,使用某种服务器或容器是绝对必要的吗?

【问题讨论】:

    标签: java database jdbc jndi connection-pooling


    【解决方案1】:

    获取命名服务和DataSource(通过池连接)是基于容器的服务。这就是你得到这个异常的原因(没有IntialContext 可用,因为没有可用的服务来提供它)。您将需要某种容器来提供这些服务。

    您始终可以编写自己的连接池逻辑,但您将从一开始就这样做。

    您还可以连接到远程服务器以获取 InitialContext 和其他服务,但我猜这不是您想要的。

    【讨论】:

    • 所以它必须成为控制台应用程序的不同类型的连接池?我不想使用容器。
    • 从你问的意义上说,我认为是的(取决于我是否理解正确)。连接池实现在 java 中没有作为标准实现。它由提供容器的供应商实现。如果您不能/不会使用容器,则必须自己修复连接池。
    • commons.apache.org/proper/commons-dbcp 是干什么用的?我可以将它添加到我的类路径中吗?
    • 我自己从未使用过该库,但可以使用任何不需要容器的连接池实现。您自己开发的代码或已经存在的库都没有关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    相关资源
    最近更新 更多