簡體   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