以下是我的计划的一部分:
try {
Class.forName("com.mysql.jdbc.Driver");
InitializeData data = new InitializeData();
Connection con = null;
try {
Context ctx = data.getContext();
MysqlDataSource ds = (MysqlDataSource)ctx.lookup("database");
con = ds.getConnection();
...
其中
public InitializeData() {
// configuring data source (data base)
ds = new MysqlDataSource();
ds.setUser("root");
ds.setPassword("%");
ds.setServerName("localhost");
ds.setPort(3306);
// configuring jndi
try {
Properties env = new Properties();
try {
env.load(new FileInputStream(env_props));
} catch (FileNotFoundException e) {
System.err.println("Unable to load jndi properties");
System.exit(1);
} catch (IOException e) {
System.err.println("IOException");
System.exit(1);
}
ctx = new InitialContext(env);
ctx.rebind("database", ds);
} catch (NamingException e) {
System.err.println("Naming Exception");
System.exit(1);
}
}
public Context getContext() {
return ctx;
}
如您所见,我尝试连接到MySQL。实际上,MySQL嵌入在我的java程序中。
当我通过DriverManager连接时(使用con = DriverManager.getConnection("jdbc:mysql:mxj://localhost", "root", "");
)一切正常。但是如上所示使用DataSource对象会调用异常:
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.net.ConnectException
MESSAGE: Connection refused: connect
STACKTRACE:
java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:271)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2771)
at com.mysql.jdbc.Connection.<init>(Connection.java:1555)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
at com.mysql.jdbc.jdbc2.optional.MysqlDataSource.getConnection(MysqlDataSource.java:425)
at com.mysql.jdbc.jdbc2.optional.MysqlDataSource.getConnection(MysqlDataSource.java:140)
at com.mysql.jdbc.jdbc2.optional.MysqlDataSource.getConnection(MysqlDataSource.java:110)
at statistics.DatabaseWorks.main(DatabaseWorks.java:26)
请有人帮助我吗?
有些测试认为我的程序试图连接到未嵌入的MySQL服务器(参见BalusC的回答)。如果我启动服务器(不是嵌入式),一切正常。所以我需要一种方式来说出我的程序来启动本地程序。出于某种原因ds.setUrl("jdbc:mysql:mxj://");
不起作用
答案 0 :(得分:1)
您正在尝试连接到真正的MySQL服务器而不是嵌入式MySQL服务器。
我从来没有尝试过,但理论上应该有以下几点:
ds.setUrl("jdbc:mysql:mxj://localhost");
ds.setUser("root");
ds.setPassword("");
所以使用与DriverManager#getConnection()
完全相同的参数。
顺便说一下,InitializeData
事情过于复杂。我建议简化这个。由于您是手动创建数据源,因此根本不需要将其放在JNDI范围内。只需创建ds
并直接使用ds.getConnection()
即可。只有在将数据源的创建委托给某些JNDI容器(如Java EE应用程序服务器)时,JNDI才有用。
更新:看起来MysqlDataSource
根本不是为嵌入式MySQL设计的。如果您只想要一个连接池数据源,请尝试c3p0。它应该普遍适用,因为它需要的只是完整的JDBC URL,用户名和密码,与传递给DriverManager
时完全相同。