如何在Java中手动配置DataSource?

Eri*_*son 43 java datasource jdbc

我正在尝试在http://java.sun.com/docs/books/tutorial/jdbc/basics/connecting.html上关注Sun的JDBC教程.

它给出了以下示例代码:

DataSource ds = (DataSource) org.apache.derby.jdbc.ClientDataSource()
ds.setPort(1527);
ds.setHost("localhost");
ds.setUser("APP")
ds.setPassword("APP");

Connection con = ds.getConnection();
Run Code Online (Sandbox Code Playgroud)

此代码无法编译,因为DataSource除了getConnection()上次调用的方法之外,接口没有这些方法.

(这是javadoc:http: //java.sun.com/javase/6/docs/api/javax/sql/DataSource.html)

我错过了什么?

编辑: 我实际上是在尝试连接MySQL(com.mysql.jdbc)而我找不到javadoc.我会接受一个指向我的答案:

1)com.mysql.jdbc关于DataSource我能理解的文件,或者

2)为任何数据库提供了教程代码应该遵循的示例.

Col*_*inD 127

您可能想要了解的一件事是Commons DBCP项目.它提供了一个BasicDataSource,其配置与您的示例非常相似.要使用它,您需要在类路径中使用数据库供应商的JDBC JAR,并且必须以正确的格式指定供应商的驱动程序类名称和数据库URL.

编辑:

如果你想配置一个BasicDataSourcefor MySQL,你会做这样的事情:

BasicDataSource dataSource = new BasicDataSource();

dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUsername("username");
dataSource.setPassword("password");
dataSource.setUrl("jdbc:mysql://<host>:<port>/<database>");
dataSource.setMaxActive(10);
dataSource.setMaxIdle(5);
dataSource.setInitialSize(5);
dataSource.setValidationQuery("SELECT 1");
Run Code Online (Sandbox Code Playgroud)

DataSource然后需要的代码可以使用它.


Yis*_*hai 21

基本上在JDBC中,大多数这些属性在API中都不可配置,而是依赖于实现.JDBC处理此问题的方法是允许每个供应商的连接URL不同.

所以你要做的就是注册驱动程序,以便JDBC系统知道如何处理URL:

 DriverManager.registerDriver((Driver) Class.forName("com.mysql.jdbc.Driver").newInstance());
Run Code Online (Sandbox Code Playgroud)

然后你形成URL:

 String url = "jdbc:mysql://[host][,failoverhost...][:port]/[database][?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]"
Run Code Online (Sandbox Code Playgroud)

最后,用它来建立连接:

 Connection c = DriverManager.getConnection(url);
Run Code Online (Sandbox Code Playgroud)

在更复杂的JDBC中,您涉及连接池等,应用程序服务器通常有自己的方式在JNDI中注册驱动程序,并从那里查找DataSource,并在其上调用getConnection.

关于MySQL支持的属性,请参见此处.

编辑:还有一个想法,技术上只是有一行代码Class.forName("com.mysql.jdbc.Driver")应该是足够的,因为类应该有自己的静态初始化程序,它注册一个版本,但有时一个JDBC驱动程序没有,所以如果你不确定,注册第二个没有什么害处,它只是在memeory中创建一个重复的对象.

  • DataSource实际上适用于提供JNDI服务的应用程序服务器和其他容器.没有JNDI服务,它们没有多大意义,而且教程在这一点上并没有真正写好. (12认同)

小智 20

DataSource是特定于供应商的,对于MySql,您可以使用MySql Java连接器jar中提供的MysqlDataSource:

    MysqlDataSource dataSource = new MysqlDataSource();
    dataSource.setDatabaseName("xyz");
    dataSource.setUser("xyz");
    dataSource.setPassword("xyz");
    dataSource.setServerName("xyz.yourdomain.com");
Run Code Online (Sandbox Code Playgroud)

  • 与官方接受的答案不同,这个答案直接解决了这个问题.谢谢@Luke. (8认同)
  • 如果你要回答一年前提出的一个问题,那么最好指出为什么目前的答案是不够的. (3认同)

小智 6

以 MYSQL 为例:1)使用数据库连接池:例如:Apache Commons DBCP ,此外,您的类路径中需要 basicDataSource jar 包

@Bean
public BasicDataSource dataSource() {
    BasicDataSource ds = new BasicDataSource();
    ds.setDriverClassName("com.mysql.jdbc.Driver");
    ds.setUrl("jdbc:mysql://localhost:3306/gene");
    ds.setUsername("root");
    ds.setPassword("root");
    return ds;
}
Run Code Online (Sandbox Code Playgroud)

2)使用基于JDBC的驱动程序,如果不考虑连接池,通常使用:

@Bean
public DataSource dataSource(){
    DriverManagerDataSource ds = new DriverManagerDataSource();
    ds.setDriverClassName("com.mysql.jdbc.Driver");
    ds.setUrl("jdbc:mysql://localhost:3306/gene");
    ds.setUsername("root");
    ds.setPassword("root");
    return ds;
}
Run Code Online (Sandbox Code Playgroud)