The original: How Java connection pooling works
What is a connection?
Connectivity is a way for our programming language to interact with the database. We often hear the phrase "database connections are expensive."
Some people accept this statement, but do not know its true meaning. So, I'll explain what it is. [If you already know, you can jump to its working principle section]
To create a connected code snippet:
" Jdbc:mysql://your.database.domain/yourdbname " ; Class.forName ("com.mysql.jdbc.Driver"= drivermanager.getconnection ( Connurl);
When we create a connection object, what it does internally:
1. "DriverManager" Check and register the driver,
2. "Com.mysql.jdbc.Driver" is our registered driver, which calls "Connect (URL ...)" in the driver class. Method.
3.com.mysql.jdbc.driver's Connect method creates a "socket connection" based on the "Connurl" of our request and connects to the database with the IP "Your.database.domain", which is the default port 3306.
4. The created socket connection will be used to query the database specified by us and eventually let the program return a result.
Why is it expensive?
Now let's talk about why it's "expensive".
It takes more time to create a socket connection than the actual operation of the query.
This is what we call "database connection is expensive" because the number of connections is 1, and it requires a socket connection to access the DB each time it is created.
Therefore, we will use the connection pool.
Connection pooling is initialized when a certain number of connections are created, and then the connection is reused from the connection pool instead of creating a new one at a time.
How does it work?
Next we'll look at how it works and how to manage or reuse existing connections.
We use the connection pool provider, which has a connection pool manager inside it when it is initialized:
1. It creates the default size of the connection pool, such as specifying the creation of 5 connection objects and storing it in any collection or array of "available" states.
For example, code snippets:
String Connurl = "Jdbc:mysql://your.database.domain/yourdbname"; String Driver= "Com.mysql.jdbc.Driver"; PrivateMap<java.sql.connection, string> ConnectionPool =NULL; Private voidInitpool () {Try{ConnectionPool=NewHashmap<java.sql.connection, string>(); Class.forName (driver); for(intPoolind = poolsize; Poolind < 0; poolind++) {java.sql.Connection con=drivermanager.getconnection (Dburl); Connectionpool.put (Con,"AVAILABLE"); } }
2. When we call Connectionprovider.getconnection (), then it gets a connection from the collection, and of course the state changes to "not available."
For example, code snippets:
PublicJava.sql.Connection getconnection ()throwsClassNotFoundException, SQLException {BooleanIsconnectionavailable =true; for(Entry<java.sql.connection, string>Entry:connectionPool.entrySet ()) { synchronized(entry) {if(Entry.getvalue () = = "AVAILABLE") {Entry.setvalue ("Notavailable"); return(java.sql.Connection) Entry.getkey (); } isconnectionavailable=false; } } if(!isconnectionavailable) {Class.forName (driver); Java.sql.Connection Con=drivermanager.getconnection (Connurl); Connectionpool.put (Con,"Notavailable"); returncon; } return NULL; }
3. When we close the resulting connection, ConnectionProvider is not actually closing the connection. Instead, just change the status to "AVAILABLE".
For example, code snippets:
Public void throws ClassNotFoundException, SQLException { for (entry<java.sql.connection, string> Entry:connectionPool.entrySet ()) { synchronized (entry) { if ( Entry.getkey (). Equals (connection)) { //Getting back the conncetion to Pool Entry.setvalue ("AVAILABLE"); }}}
Basically the connection pooling actually works like this, but it's possible to use different ways.
Now, you may have a problem with whether we can create our own connection pooling mechanism?
My advice is to use a connection pooling mechanism that already exists, such as C3P0,DBCP.
English original, oschina.net translation
How Java connection Pooling works (RPM)