Datasource 介紹與使用

Datasource 是一個連接資料庫的介面,最基本有 getConnection() 連線方法,也有 setLoginTimeout()、getLoginTimeout() 設定或取得連線 timeout 時間的方法。

Datasource

Datasource 是一個連接資料庫的介面,最基本有 getConnection() 連線方法,也有 setLoginTimeout()、getLoginTimeout() 設定或取得連線 timeout 時間的方法。

public interface DataSource  extends CommonDataSource, Wrapper {
  Connection getConnection() throws SQLException;

  Connection getConnection(String username, String password)
    throws SQLException;

  @Override
  java.io.PrintWriter getLogWriter() throws SQLException;

  @Override
  void setLogWriter(java.io.PrintWriter out) throws SQLException;

  @Override
  void setLoginTimeout(int seconds) throws SQLException;

  @Override
  int getLoginTimeout() throws SQLException;
    default ConnectionBuilder createConnectionBuilder() throws SQLException {
        throw new SQLFeatureNotSupportedException("createConnectionBuilder not implemented");
  };
}

由於 Datasource 是一個 interface,所以他並沒有定義詳細的實作方法。當然我們可以自己實作,不過要實作出來實在是太麻煩了,所以通常都會拿第三方的實作來使用,這次用的是 Apache 的 commons-dbcp2 。

首先 import dependencies: pom.xml

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-dbcp2</artifactId>
  <version>2.9.0</version>
</dependency>

再來就是使用了

import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource;

// ... 略過 ...
  public DataSource dataSource() {
      BasicDataSource ds = new BasicDataSource();
      ds.setDriverClassName("com.mysql.cj.jdbc.Driver"); // 設定連線的 Driver 名稱
      ds.setUrl("jdbc:mysql://localhost:4089/neon"); // 資料庫連線位置
      ds.setUsername("wayne"); // 帳號
      ds.setPassword("xxx"); // 密碼
      ds.setInitialSize(5); // 初始連線數

      // ds.setMaxTotal(10); // 最大連線數 以前叫做 maxActive。設定為 10 表示最多能有 10 人同時連線;設定為 0 表示無上限
      // ds.setMaxIdle(20); // 最大空閒時間,若是超過時間,連線將被視為不可用。設定為 0 的話表示無上限
      // ds.setMaxWaitMillis(); 最大「等待」連線時間,如果超過這個時間,將視為連線逾時。9000 就是 9 秒;設定為 -1 表示無限制

      return ds;
  }
// ... 略過 ...

BasicDataSource 幫我們定義了不少常用的連線資訊,像是 urlusernamepassword 等等的,只要把必要資訊定義完,使用時呼叫 getConnection() 方法,沒意外的話就可以順利連線資料庫了。