Hồ bơi
- Cơ chế gộp là cách tạo các Đối tượng trước. Khi một lớp được tải.
- Nó cải thiện ứng dụng
performance
[Bằng cách sử dụng lại cùng một đối tượng để thực hiện bất kỳ hành động nào trên Đối tượng-Dữ liệu] & memory
[cấp phát và hủy phân bổ nhiều đối tượng tạo ra chi phí quản lý bộ nhớ đáng kể].
- Không yêu cầu dọn dẹp đối tượng vì chúng ta đang sử dụng cùng một Đối tượng, giảm tải thu gom rác.
«Pooling [ Object
pool, String
Constant Pool, Thread
Pool, Connection pool]
Nhóm chuỗi không đổi
- Nhóm ký tự chuỗi chỉ duy trì một bản sao của mỗi giá trị chuỗi riêng biệt. mà phải là bất biến.
- Khi phương thức intern được gọi, nó sẽ kiểm tra tính khả dụng của đối tượng có cùng nội dung trong pool bằng phương thức equals. «Nếu String-copy có sẵn trong Pool thì trả về tham chiếu. «Nếu không, đối tượng String được thêm vào nhóm và trả về tham chiếu.
Ví dụ: Chuỗi xác minh Đối tượng duy nhất từ nhóm.
public class StringPoolTest {
public static void main(String[] args) { // Integer.valueOf(), String.equals()
String eol = System.getProperty("line.separator"); //java7 System.lineSeparator();
String s1 = "Yash".intern();
System.out.format("Val:%s Hash:%s SYS:%s "+eol, s1, s1.hashCode(), System.identityHashCode(s1));
String s2 = "Yas"+"h".intern();
System.out.format("Val:%s Hash:%s SYS:%s "+eol, s2, s2.hashCode(), System.identityHashCode(s2));
String s3 = "Yas".intern()+"h".intern();
System.out.format("Val:%s Hash:%s SYS:%s "+eol, s3, s3.hashCode(), System.identityHashCode(s3));
String s4 = "Yas"+"h";
System.out.format("Val:%s Hash:%s SYS:%s "+eol, s4, s4.hashCode(), System.identityHashCode(s4));
}
}
Kết nối hồ bơi sử dụng Type-4 điều khiển sử dụng thư viện của bên thứ 3 [ DBCP2
, c3p0
, Tomcat JDBC
]
Type 4 - The Thin driver converts JDBC calls directly into the vendor-specific database protocol Ex[Oracle - Thick, MySQL - Quora].
wiki
Trong cơ chế nhóm kết nối, khi lớp được tải, nó nhận các physical JDBC connection
đối tượng và cung cấp một đối tượng kết nối vật lý được bao bọc cho người dùng. PoolableConnection
là một trình bao bọc xung quanh kết nối thực tế.
getConnection()
chọn một trong các gói kết nối miễn phí hình thức kết nối objectpool và trả về nó.
close()
thay vì đóng nó sẽ trả kết nối được bọc trở lại nhóm.
Ví dụ: Sử dụng ~ Nhóm kết nối DBCP2 với Java 7 [ try-with-resources
]
public class ConnectionPool {
static final BasicDataSource ds_dbcp2 = new BasicDataSource();
static final ComboPooledDataSource ds_c3p0 = new ComboPooledDataSource();
static final DataSource ds_JDBC = new DataSource();
static Properties prop = new Properties();
static {
try {
prop.load(ConnectionPool.class.getClassLoader().getResourceAsStream("connectionpool.properties"));
ds_dbcp2.setDriverClassName( prop.getProperty("DriverClass") );
ds_dbcp2.setUrl( prop.getProperty("URL") );
ds_dbcp2.setUsername( prop.getProperty("UserName") );
ds_dbcp2.setPassword( prop.getProperty("Password") );
ds_dbcp2.setInitialSize( 5 );
ds_c3p0.setDriverClass( prop.getProperty("DriverClass") );
ds_c3p0.setJdbcUrl( prop.getProperty("URL") );
ds_c3p0.setUser( prop.getProperty("UserName") );
ds_c3p0.setPassword( prop.getProperty("Password") );
ds_c3p0.setMinPoolSize(5);
ds_c3p0.setAcquireIncrement(5);
ds_c3p0.setMaxPoolSize(20);
PoolProperties pool = new PoolProperties();
pool.setUrl( prop.getProperty("URL") );
pool.setDriverClassName( prop.getProperty("DriverClass") );
pool.setUsername( prop.getProperty("UserName") );
pool.setPassword( prop.getProperty("Password") );
pool.setValidationQuery("SELECT 1");// SELECT 1(mysql) select 1 from dual(oracle)
pool.setInitialSize(5);
pool.setMaxActive(3);
ds_JDBC.setPoolProperties( pool );
} catch (IOException e) { e.printStackTrace();
} catch (PropertyVetoException e) { e.printStackTrace(); }
}
public static Connection getDBCP2Connection() throws SQLException {
return ds_dbcp2.getConnection();
}
public static Connection getc3p0Connection() throws SQLException {
return ds_c3p0.getConnection();
}
public static Connection getJDBCConnection() throws SQLException {
return ds_JDBC.getConnection();
}
}
public static boolean exists(String UserName, String Password ) throws SQLException {
boolean exist = false;
String SQL_EXIST = "SELECT * FROM users WHERE username=? AND password=?";
try ( Connection connection = ConnectionPool.getDBCP2Connection();
PreparedStatement pstmt = connection.prepareStatement(SQL_EXIST); ) {
pstmt.setString(1, UserName );
pstmt.setString(2, Password );
try (ResultSet resultSet = pstmt.executeQuery()) {
exist = resultSet.next(); // Note that you should not return a ResultSet here.
}
}
System.out.println("User : "+exist);
return exist;
}
jdbc:<DB>:<drivertype>:<HOST>:<TCP/IP PORT>:<dataBaseName>
jdbc:
oracle
:thin:@localhost:1521:myDBName
jdbc:
mysql
://localhost:3306/myDBName
connectionpool.properties
URL : jdbc:mysql://localhost:3306/myDBName
DriverClass : com.mysql.jdbc.Driver
UserName : root
Password :
Ứng dụng Web : Để tránh sự cố kết nối khi tất cả kết nối bị đóng [MySQL "wait_timeout" mặc định 8 giờ] để mở lại kết nối với DB bên dưới.
Bạn có thể thực hiện việc này để Kiểm tra mọi kết nối bằng cách đặt testOnBorrow = true and validationQuery = "SELECT 1" và không sử dụng autoReconnect cho máy chủ MySQL vì nó không được dùng nữa. vấn đề
===== ===== context.xml ===== =====
<?xml version="1.0" encoding="UTF-8"?>
<!-- The contents of this file will be loaded for a web application -->
<Context>
<Resource name="jdbc/MyAppDB" auth="Container"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
type="javax.sql.DataSource"
initialSize="5" minIdle="5" maxActive="15" maxIdle="10"
testWhileIdle="true"
timeBetweenEvictionRunsMillis="30000"
testOnBorrow="true"
validationQuery="SELECT 1"
validationInterval="30000"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/myDBName"
username="yash" password="777"
/>
</Context>
===== ===== web.xml ===== =====
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/MyAppDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
===== ===== DBOperations ===== =====
servlet « init() {}
Normal call used by sevlet « static {}
static DataSource ds;
static {
try {
Context ctx=new InitialContext();
Context envContext = (Context)ctx.lookup("java:comp/env");
ds = (DataSource) envContext.lookup("jdbc/MyAppDB");
} catch (NamingException e) { e.printStackTrace(); }
}
Xem thêm: