繁体   English   中英

如何在 Java 中手动配置数据源?

[英]How do I manually configure a DataSource in Java?

我正在尝试在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();

此代码无法编译,因为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) 给出了一个例子来说明教程的代码应该是什么,对于任何数据库。

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

编辑:

如果你想为 MySQL 配置一个BasicDataSource ,你可以这样做:

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");

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

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

因此,您要做的是注册驱动程序,以便 JDBC 系统可以知道如何处理 URL:

 DriverManager.registerDriver((Driver) Class.forName("com.mysql.jdbc.Driver").newInstance());

然后形成 URL:

 String url = "jdbc:mysql://[host][,failoverhost...][:port]/[database][?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]"

最后,使用它来获取连接:

 Connection c = DriverManager.getConnection(url);

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

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

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

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

    MysqlDataSource dataSource = new MysqlDataSource();
    dataSource.setDatabaseName("xyz");
    dataSource.setUser("xyz");
    dataSource.setPassword("xyz");
    dataSource.setServerName("xyz.yourdomain.com");

以 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;
}

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;
}

我认为这个例子是错误的 -javax.sql.DataSource也没有这些属性。 您的DataSource需要是org.apache.derby.jdbc.ClientDataSource类型,它应该具有这些属性。

您引用的 DataSource 的 javadoc 是错误的包。 你应该看看javax.sql.DataSource 如您所见,这是一个界面。 主机名和端口名配置取决于实现,即您使用的 JDBC 驱动程序。

我没有检查过 Derby javadocs,但我想代码应该像这样编译:

ClientDataSource ds = org.apache.derby.jdbc.ClientDataSource()
ds.setHost etc....

对于 postgres,下面的工作。 我实际上在整数测试中使用了它。 我想应该更多地考虑生产用途。

PGSimpleDataSource ds = new PGSimpleDataSource() ;  
ds.setServerName( "localhost" );  
ds.setDatabaseName( "your_db_name_here" );   
ds.setUser( "scott" );       
ds.setPassword( "tiger" );   

该类捆绑在 postgres jdbc 驱动程序中。

我关注的原始stackoverflow帖子: https : //stackoverflow.com/a/45091982/3877642

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM