पूल
- पूलिंग मैकेनिज्म ऑब्जेक्ट्स को पहले से बनाने का तरीका है। जब एक कक्षा भरी हुई है।
- यह एप्लिकेशन को बेहतर बनाता है
performance
[ऑब्जेक्ट-डेटा पर किसी भी क्रिया को करने के लिए एक ही ऑब्जेक्ट का उपयोग करके] और memory
[कई ऑब्जेक्ट्स को आवंटित करना और डी-आवंटित करना एक महत्वपूर्ण मेमोरी मैनेजमेंट ओवरहेड बनाता है]।
- ऑब्जेक्ट क्लीन-अप की आवश्यकता नहीं है क्योंकि हम एक ही ऑब्जेक्ट का उपयोग कर रहे हैं, कचरा संग्रह लोड को कम कर रहे हैं।
«पूलिंग [ Object
पूल, String
लगातार पूल, Thread
पूल, कनेक्शन पूल]
स्ट्रिंग कॉन्सटेंट पूल
- स्ट्रिंग शाब्दिक पूल प्रत्येक विशिष्ट स्ट्रिंग मान की केवल एक प्रति रखता है। जो अपरिवर्तनीय होना चाहिए।
- जब इंटर्न विधि को लागू किया जाता है, तो यह बराबर पद्धति का उपयोग करके पूल में समान सामग्री के साथ ऑब्जेक्ट उपलब्धता की जांच करता है। «अगर स्ट्रिंग-कॉपी पूल में उपलब्ध है तो संदर्भ लौटाता है। «अन्यथा, स्ट्रिंग ऑब्जेक्ट को पूल में जोड़ा जाता है और संदर्भ देता है।
उदाहरण: पूल से अनन्य ऑब्जेक्ट को सत्यापित करने के लिए स्ट्रिंग ।
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));
}
}
कनेक्शन पूल प्रकार -4 का उपयोग कर चालक 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].
विकि
कनेक्शन पूल तंत्र में, जब कक्षा को लोड किया जाता है तो यह physical JDBC connection
ऑब्जेक्ट्स प्राप्त करता है और उपयोगकर्ता को एक लिपटे हुए भौतिक कनेक्शन ऑब्जेक्ट प्रदान करता है। PoolableConnection
वास्तविक कनेक्शन के आसपास एक आवरण है।
getConnection()
मुफ्त लिपटे-कनेक्शन में से किसी एक को चुनें, कनेक्शन ऑब्जेक्टपुल बनाता है और इसे वापस करता है।
close()
बंद करने के बजाय यह लिपटे-कनेक्शन को वापस पूल में लौटाता है।
उदाहरण: जावा 7 के साथ ~ DBCP2 कनेक्शन पूल का उपयोग करना [ 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 :
वेब अनुप्रयोग: कनेक्शन समस्या से बचने के लिए जब सभी कनेक्शन बंद हो गए हैं [MySQL "wa_timeout" डिफ़ॉल्ट 8 घंटे] अंतर्निहित DB के साथ कनेक्शन को फिर से खोलने के लिए।
आप यह कर सकते हैं कि प्रत्येक कनेक्शन को TestOnBreat = true और validationQuery = "Select 1" सेट करके टेस्ट करें और MySQL सर्वर के लिए ऑटो-कनेक्ट का उपयोग न करें क्योंकि यह पदावनत है। मुद्दा
===== ===== 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(); }
}
इन्हें भी देखें: