Date post: | 17-Jul-2015 |
Category: |
Technology |
Upload: | david-bennett |
View: | 104 times |
Download: | 1 times |
David BennettQA Engineer
April 15th, 2015
Using MySQL with JavaQ2 2014
www.percona.com2
Who are you?
Java Experts, Intermediate, Beginners
MySQL Experts, Intermediate, Beginners
Developers, DBAs, System Admins
Just interested
www.percona.com3
Me
QA Engineer at Percona Designer/Developer/Consultant 20+ years in technology 15+ years working with MySQL 15+ years working with Java Focused on web apps Linux devotee I love MySQL, I like Java
Dave Bennett
www.percona.com4
Basic Topology
Java Application(Web, Service, Desktop)
Java Runtime Engine(JRE)
JDBC Interface
JDBC Driver (Connector/J)
MySQL
www.percona.com5
What is JDBC?
A standardized interface between Java and SQL
JDBC is to Java what ODBC is to Windows
Virtually all Java/SQL applications use JDBC
Like ODBC, JDBC is used more and more on
Servers, Desktop use waning.
www.percona.com6
What is Connector/J?
Most widely used JDBC Driver for MySQL today
Started life in 1998 as MM.MySQL (M. Matthews)
Acquired by MySQL AB in 2002
Owned by Oracle today, available under GPLv2
JDBC Type 4 – 100% Java – No Middleware
www.percona.com7
import java.sql.*;public class MysqlVersion { public static void main(String[] args) throws SQLException,ClassNotFoundException { Class.forName( "com.mysql.jdbc.Driver" ); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/test","user","pwd" ); Statement st = con.createStatement(); ResultSet rs = st.executeQuery( "SELECT concat('Hello from mysql ',version()) AS msg" ); if (rs.next()) { System.out.println(rs.getString("msg")); } rs.close(); st.close(); con.close(); }}
www.percona.com8
import java.sql.*;public class MysqlVersion { public static void main(String[] args) throws SQLException,ClassNotFoundException { Class.forName( "com.mysql.jdbc.Driver" ); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/test","user","pwd" ); Statement st = con.createStatement(); ResultSet rs = st.executeQuery( "SELECT concat('Hello from mysql ',version()) AS msg" ); if (rs.next()) { System.out.println(rs.getString("msg")); } rs.close(); st.close(); con.close(); }}
www.percona.com9
import java.sql.*;public class MysqlVersion { public static void main(String[] args) throws SQLException,ClassNotFoundException { Class.forName( "com.mysql.jdbc.Driver" ); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/test","user","pwd" ); Statement st = con.createStatement(); ResultSet rs = st.executeQuery( "SELECT concat('Hello from mysql ',version()) AS msg" ); if (rs.next()) { System.out.println(rs.getString("msg")); } rs.close(); st.close(); con.close(); }}
www.percona.com10
import java.sql.*;public class MysqlVersion { public static void main(String[] args) throws SQLException,ClassNotFoundException { Class.forName( "com.mysql.jdbc.Driver" ); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/test","user","pwd" ); Statement st = con.createStatement(); ResultSet rs = st.executeQuery( "SELECT concat('Hello from mysql ',version()) AS msg" ); if (rs.next()) { System.out.println(rs.getString("msg")); } rs.close(); st.close(); con.close(); }}
www.percona.com11
import java.sql.*;public class MysqlVersion { public static void main(String[] args) throws SQLException,ClassNotFoundException { Class.forName( "com.mysql.jdbc.Driver" ); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/test","user","pwd" ); Statement st = con.createStatement(); ResultSet rs = st.executeQuery( "SELECT concat('Hello from mysql ',version()) AS msg" ); if (rs.next()) { System.out.println(rs.getString("msg")); } rs.close(); st.close(); con.close(); }}
www.percona.com12
import java.sql.*;public class MysqlVersion { public static void main(String[] args) throws SQLException,ClassNotFoundException { Class.forName( "com.mysql.jdbc.Driver" ); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/test","user","pwd" ); Statement st = con.createStatement(); ResultSet rs = st.executeQuery( "SELECT concat('Hello from mysql ',version()) AS msg" ); if (rs.next()) { System.out.println(rs.getString("msg")); } rs.close(); st.close(); con.close(); }}
www.percona.com13
import java.sql.*;public class MysqlVersion { public static void main(String[] args) throws SQLException,ClassNotFoundException { Class.forName( "com.mysql.jdbc.Driver" ); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/test","user","pwd" ); Statement st = con.createStatement(); ResultSet rs = st.executeQuery( "SELECT concat('Hello from mysql ',version()) AS msg" ); if (rs.next()) { System.out.println(rs.getString("msg")); } rs.close(); st.close(); con.close(); }}
www.percona.com14
import java.sql.*;public class MysqlVersion { public static void main(String[] args) throws SQLException,ClassNotFoundException { Class.forName( "com.mysql.jdbc.Driver" ); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/test","user","pwd" ); Statement st = con.createStatement(); ResultSet rs = st.executeQuery( "SELECT concat('Hello from mysql ',version()) AS msg" ); if (rs.next()) { System.out.println(rs.getString("msg")); } rs.close(); st.close(); con.close(); }}
www.percona.com15
import java.sql.*;public class MysqlVersion { public static void main(String[] args) throws SQLException,ClassNotFoundException { Class.forName( "com.mysql.jdbc.Driver" ); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/test","user","pwd" ); Statement st = con.createStatement(); ResultSet rs = st.executeQuery( "SELECT concat('Hello from mysql ',version()) AS msg" ); if (rs.next()) { System.out.println(rs.getString("msg")); } rs.close(); st.close(); con.close(); }}
16 www.percona.com
www.percona.com17
Connector/J Basic* URL
jdbc:mysql://[host][:port]/[database][?prop=val[&prop=val]]
Where: is:host TCP/IP host (defaults to IPV4 127.0.0.1)port TCP/IP port (defaults to 3306)database Database name (defaults to none)prop A configuration propertyval The configuration property's value
* There are more advanced options for other protocols (IPV6, Named Pipes), replication, failover, load balancing, etc...
www.percona.com18
Connector/J URL Examples
jdbc:mysql://Connect the MySQL server at 127.0.0.1 on port 3306 without specifying a database. You must use Connection.setCatalog("{database}") or database.table reference in queries.
jdbc:mysql://dbserverConnect the MySQL server dbserver on port 3306 without specifying a database. You must use Connection.setCatalog("{database}") or database.table reference in queries.
jdbc:mysql://dbserver:3307/mydbConnect the MySQL server dbserver on port 3307 using database mydb.
jdbc:mysql://dbserver/mydbConnect the MySQL server dbserver on port 3306 using database mydb.
www.percona.com19
Connector/J URL Examples
jdbc:mysql://Connect the MySQL server at 127.0.0.1 on port 3306 without specifying a database. You must use Connection.setCatalog("{database}") or database.table reference in queries.
jdbc:mysql://dbserverConnect the MySQL server dbserver on port 3306 without specifying a database. You must use Connection.setCatalog("{database}") or database.table reference in queries.
jdbc:mysql://dbserver:3307/mydbConnect the MySQL server dbserver on port 3307 using database mydb.
jdbc:mysql://dbserver/mydbConnect the MySQL server dbserver on port 3306 using database mydb.
www.percona.com20
Connector/J URL Examples
jdbc:mysql://Connect the MySQL server at 127.0.0.1 on port 3306 without specifying a database. You must use Connection.setCatalog("{database}") or database.table reference in queries.
jdbc:mysql://dbserverConnect the MySQL server dbserver on port 3306 without specifying a database. You must use Connection.setCatalog("{database}") or database.table reference in queries.
jdbc:mysql://dbserver:3307/mydbConnect the MySQL server dbserver on port 3307 using database mydb.
jdbc:mysql://dbserver/mydbConnect the MySQL server dbserver on port 3306 using database mydb.
www.percona.com21
Connector/J URL Examples
jdbc:mysql://Connect the MySQL server at 127.0.0.1 on port 3306 without specifying a database. You must use Connection.setCatalog("{database}") or database.table reference in queries.
jdbc:mysql://dbserverConnect the MySQL server dbserver on port 3306 without specifying a database. You must use Connection.setCatalog("{database}") or database.table reference in queries.
jdbc:mysql://dbserver:3307/mydbConnect the MySQL server dbserver on port 3307 using database mydb.
jdbc:mysql://dbserver/mydbConnect the MySQL server dbserver on port 3306 using database mydb.
www.percona.com22
Connector/J URL Examples
jdbc:mysql://Connect the MySQL server at 127.0.0.1 on port 3306 without specifying a database. You must use Connection.setCatalog("{database}") or database.table reference in queries.
jdbc:mysql://dbserverConnect the MySQL server dbserver on port 3306 without specifying a database. You must use Connection.setCatalog("{database}") or database.table reference in queries.
jdbc:mysql://dbserver:3307/mydbConnect the MySQL server dbserver on port 3307 using database mydb.
jdbc:mysql://dbserver/mydbConnect the MySQL server dbserver on port 3306 using database mydb.
www.percona.com23
Connector/J parametersPassing in JDBC URL:
dbProperties.load(MyClass.class.getClassLoader().getResourceAsStream("db.properties"));
Connection con = DriverManager.getConnection("jdbc:mysql://", dbProperties);
Passing in a Properties file:
Connection con = DriverManager.getConnection( "jdbc:mysql://host/db?autoReconnect=true&useConfigs=maxPerformance");
MysqlDataSource mds=new MysqlDataSource();mds.setUrl("jdbc:mysql://");mds.setUser("user");mds.setPassword("pwd");mds.setAutoReconnect(true);mds.setUseConfigs("maxPerformance");Connection con=mds.getConnection();
Passing from MysqlDataSource set*() methods:
www.percona.com24
Connector/J parametersPassing in JDBC URL:
dbProperties.load(MyClass.class.getClassLoader().getResourceAsStream("db.properties"));
Connection con = DriverManager.getConnection("jdbc:mysql://", dbProperties);
Passing in a Properties file:
Connection con = DriverManager.getConnection( "jdbc:mysql://host/db?autoReconnect=true&useConfigs=maxPerformance");
MysqlDataSource mds=new MysqlDataSource();mds.setUrl("jdbc:mysql://");mds.setUser("user");mds.setPassword("pwd");mds.setAutoReconnect(true);mds.setUseConfigs("maxPerformance");Connection con=mds.getConnection();
Passing from MysqlDataSource set*() methods:
www.percona.com25
Connector/J parametersPassing in JDBC URL:
dbProperties.load(MyClass.class.getClassLoader().getResourceAsStream("db.properties"));
Connection con = DriverManager.getConnection("jdbc:mysql://", dbProperties);
Passing in a Properties file:
Connection con = DriverManager.getConnection( "jdbc:mysql://host/db?autoReconnect=true&useConfigs=maxPerformance");
MysqlDataSource mds=new MysqlDataSource();mds.setUrl("jdbc:mysql://");mds.setUser("user");mds.setPassword("pwd");mds.setAutoReconnect(true);mds.setUseConfigs("maxPerformance");Connection con=mds.getConnection();
Passing from MysqlDataSource set*() methods:
www.percona.com26
Connector/J parametersPassing in JDBC URL:
dbProperties.load(MyClass.class.getClassLoader().getResourceAsStream("db.properties"));
Connection con = DriverManager.getConnection("jdbc:mysql://", dbProperties);
Passing in a Properties file:
Connection con = DriverManager.getConnection( "jdbc:mysql://host/db?autoReconnect=true&useConfigs=maxPerformance");
MysqlDataSource mds=new MysqlDataSource();mds.setUrl("jdbc:mysql://");mds.setUser("user");mds.setPassword("pwd");mds.setAutoReconnect(true);mds.setUseConfigs("maxPerformance");Connection con=mds.getConnection();
Passing from MysqlDataSource set*() methods:
www.percona.com27
Generic JDBC App Exampleimport java.io.IOException;import java.sql.*;import java.util.Properties;public class DBHello { public static void main(String[] args) throws SQLException,ClassNotFoundException,IOException { Properties dbp = new Properties(); dbp.load(DBHello.class.getClassLoader() .getResourceAsStream("db.properties")); Class.forName(dbp.getProperty("class")); Connection con = DriverManager.getConnection(dbp.getProperty("url"), dbp); Statement st = con.createStatement(); ResultSet rs = st.executeQuery(dbp.getProperty("versionQuery")); if (rs.next()) { System.out.printf("Hello from %s\n",rs.getString("version")); } rs.close(); st.close(); con.close(); }}
www.percona.com28
Generic JDBC App Exampleimport java.io.IOException;import java.sql.*;import java.util.Properties;public class DBHello { public static void main(String[] args) throws SQLException,ClassNotFoundException,IOException { Properties dbp = new Properties(); dbp.load(DBHello.class.getClassLoader() .getResourceAsStream("db.properties")); Class.forName(dbp.getProperty("class")); Connection con = DriverManager.getConnection(dbp.getProperty("url"), dbp); Statement st = con.createStatement(); ResultSet rs = st.executeQuery(dbp.getProperty("versionQuery")); if (rs.next()) { System.out.printf("Hello from %s\n",rs.getString("version")); } rs.close(); st.close(); con.close(); }}
www.percona.com29
Generic JDBC App Exampleimport java.io.IOException;import java.sql.*;import java.util.Properties;public class DBHello { public static void main(String[] args) throws SQLException,ClassNotFoundException,IOException { Properties dbp = new Properties(); dbp.load(DBHello.class.getClassLoader() .getResourceAsStream("db.properties")); Class.forName(dbp.getProperty("class")); Connection con = DriverManager.getConnection(dbp.getProperty("url"), dbp); Statement st = con.createStatement(); ResultSet rs = st.executeQuery(dbp.getProperty("versionQuery")); if (rs.next()) { System.out.printf("Hello from %s\n",rs.getString("version")); } rs.close(); st.close(); con.close(); }}
www.percona.com30
Generic JDBC App Exampledb.properties configured for MySQL:# driverclass=com.mysql.jdbc.Driver# connection urlurl=jdbc:mysql://localhostuser=userpassword=pwd# parametersautoReconnect=trueuseConfigs=maxPerformance# version queryversionQuery=SELECT CONCAT_WS(' ',@@version_comment,@@version,\ @@version_compile_os,@@version_compile_machine) AS `version`
Returns:
Hello from MySQL Community Server (GPL) 5.6.23-log Linux x86_64
www.percona.com31
Prepared Statements
Security – Better protection from SQL injection attacks, parameters are sent separately, escaping unnecessary
Performance – Prepared Statements are re-usable. Interpretation and Optimization happens only once.
More Performance – Combined with Pooling/Caching.
Use them whenever you can.
www.percona.com32
Let's do something useful
Runs as a service, records storage capacity to a table Runs as a report, outputs capacity growth over time Load JDBC configuration from a Java properties file PreparedStatement Query with ResultSet Use and Reuse of PreparedStatement Batch inserts using addBatch/executeBatch Dynamic DDL creation
DiskFreeChecker.javagithub.com/dbpercona/DiskFreeChecker
www.percona.com33
Prepared Statement Querypst=con.prepareStatement( "SELECT * FROM diskfree WHERE `hostname` = ? AND `when` = ?");pst.setString(1, hostname);pst.setTimestamp(2, ts);rs=pst.executeQuery();while (rs.next()) { DiskFreeEntry dfe=new DiskFreeEntry(); dfe.id = rs.getLong("id"); dfe.hostname = rs.getString("hostname"); dfe.fileSystemName = rs.getString("file_system_name"); dfe.totalSpace = rs.getLong("total_space"); dfe.spaceUsed = rs.getLong("space_used"); dfe.spaceFree = rs.getLong("space_free"); dfe.percentageUsed = rs.getBigDecimal("percentage_used"); dfe.fileSystemRoot = rs.getString("file_system_root"); dfe.when = rs.getTimestamp("file_system_root"); diskFreeEntries.put(dfe.fileSystemRoot,dfe);}rs.close(); pst.close();
www.percona.com34
Prepared Statement Querypst=con.prepareStatement( "SELECT * FROM diskfree WHERE `hostname` = ? AND `when` = ?");pst.setString(1, hostname);pst.setTimestamp(2, ts);rs=pst.executeQuery();while (rs.next()) { DiskFreeEntry dfe=new DiskFreeEntry(); dfe.id = rs.getLong("id"); dfe.hostname = rs.getString("hostname"); dfe.fileSystemName = rs.getString("file_system_name"); dfe.totalSpace = rs.getLong("total_space"); dfe.spaceUsed = rs.getLong("space_used"); dfe.spaceFree = rs.getLong("space_free"); dfe.percentageUsed = rs.getBigDecimal("percentage_used"); dfe.fileSystemRoot = rs.getString("file_system_root"); dfe.when = rs.getTimestamp("file_system_root"); diskFreeEntries.put(dfe.fileSystemRoot,dfe);}rs.close(); pst.close();
www.percona.com35
Prepared Statement Querypst=con.prepareStatement( "SELECT * FROM diskfree WHERE `hostname` = ? AND `when` = ?");pst.setString(1, hostname);pst.setTimestamp(2, ts);rs=pst.executeQuery();while (rs.next()) { DiskFreeEntry dfe=new DiskFreeEntry(); dfe.id = rs.getLong("id"); dfe.hostname = rs.getString("hostname"); dfe.fileSystemName = rs.getString("file_system_name"); dfe.totalSpace = rs.getLong("total_space"); dfe.spaceUsed = rs.getLong("space_used"); dfe.spaceFree = rs.getLong("space_free"); dfe.percentageUsed = rs.getBigDecimal("percentage_used"); dfe.fileSystemRoot = rs.getString("file_system_root"); dfe.when = rs.getTimestamp("file_system_root"); diskFreeEntries.put(dfe.fileSystemRoot,dfe);}rs.close(); pst.close();
www.percona.com36
Prepared Statement Querypst=con.prepareStatement( "SELECT * FROM diskfree WHERE `hostname` = ? AND `when` = ?");pst.setString(1, hostname);pst.setTimestamp(2, ts);rs=pst.executeQuery();while (rs.next()) { DiskFreeEntry dfe=new DiskFreeEntry(); dfe.id = rs.getLong("id"); dfe.hostname = rs.getString("hostname"); dfe.fileSystemName = rs.getString("file_system_name"); dfe.totalSpace = rs.getLong("total_space"); dfe.spaceUsed = rs.getLong("space_used"); dfe.spaceFree = rs.getLong("space_free"); dfe.percentageUsed = rs.getBigDecimal("percentage_used"); dfe.fileSystemRoot = rs.getString("file_system_root"); dfe.when = rs.getTimestamp("file_system_root"); diskFreeEntries.put(dfe.fileSystemRoot,dfe);}rs.close(); pst.close();
www.percona.com37
Prepared Statement Querypst=con.prepareStatement( "SELECT * FROM diskfree WHERE `hostname` = ? AND `when` = ?");pst.setString(1, hostname);pst.setTimestamp(2, ts);rs=pst.executeQuery();while (rs.next()) { DiskFreeEntry dfe=new DiskFreeEntry(); dfe.id = rs.getLong("id"); dfe.hostname = rs.getString("hostname"); dfe.fileSystemName = rs.getString("file_system_name"); dfe.totalSpace = rs.getLong("total_space"); dfe.spaceUsed = rs.getLong("space_used"); dfe.spaceFree = rs.getLong("space_free"); dfe.percentageUsed = rs.getBigDecimal("percentage_used"); dfe.fileSystemRoot = rs.getString("file_system_root"); dfe.when = rs.getTimestamp("file_system_root"); diskFreeEntries.put(dfe.fileSystemRoot,dfe);}rs.close(); pst.close();
www.percona.com38
Prepared Statement Querypst=con.prepareStatement( "SELECT * FROM diskfree WHERE `hostname` = ? AND `when` = ?");pst.setString(1, hostname);pst.setTimestamp(2, ts);rs=pst.executeQuery();while (rs.next()) { DiskFreeEntry dfe=new DiskFreeEntry(); dfe.id = rs.getLong("id"); dfe.hostname = rs.getString("hostname"); dfe.fileSystemName = rs.getString("file_system_name"); dfe.totalSpace = rs.getLong("total_space"); dfe.spaceUsed = rs.getLong("space_used"); dfe.spaceFree = rs.getLong("space_free"); dfe.percentageUsed = rs.getBigDecimal("percentage_used"); dfe.fileSystemRoot = rs.getString("file_system_root"); dfe.when = rs.getTimestamp("file_system_root"); diskFreeEntries.put(dfe.fileSystemRoot,dfe);}rs.close(); pst.close();
www.percona.com39
Prepared Statement Querypst=con.prepareStatement( "SELECT * FROM diskfree WHERE `hostname` = ? AND `when` = ?");pst.setString(1, hostname);pst.setTimestamp(2, ts);rs=pst.executeQuery();while (rs.next()) { DiskFreeEntry dfe=new DiskFreeEntry(); dfe.id = rs.getLong("id"); dfe.hostname = rs.getString("hostname"); dfe.fileSystemName = rs.getString("file_system_name"); dfe.totalSpace = rs.getLong("total_space"); dfe.spaceUsed = rs.getLong("space_used"); dfe.spaceFree = rs.getLong("space_free"); dfe.percentageUsed = rs.getBigDecimal("percentage_used"); dfe.fileSystemRoot = rs.getString("file_system_root"); dfe.when = rs.getTimestamp("file_system_root"); diskFreeEntries.put(dfe.fileSystemRoot,dfe);}rs.close(); pst.close();
www.percona.com40
Prepared Statement Reusepst = con.prepareStatement("SELECT MAX(`when`) FROM diskfree " + "WHERE `when` < ( NOW() - INTERVAL ? SECOND ) " + "AND `hostname` = ?");// thenpst.setBigDecimal(1, secondsBack);pst.setString(2, hostname);rs = pst.executeQuery();if (rs.next()) { then = rs.getTimestamp(1);}rs.close();// nowpst.setInt(1, 0);rs = pst.executeQuery();if (rs.next()) { now = rs.getTimestamp(1);}rs.close();pst.close();
www.percona.com41
Prepared Statement Reusepst = con.prepareStatement("SELECT MAX(`when`) FROM diskfree " + "WHERE `when` < ( NOW() - INTERVAL ? SECOND ) " + "AND `hostname` = ?");// thenpst.setBigDecimal(1, secondsBack);pst.setString(2, hostname);rs = pst.executeQuery();if (rs.next()) { then = rs.getTimestamp(1);}rs.close();// nowpst.setInt(1, 0);rs = pst.executeQuery();if (rs.next()) { now = rs.getTimestamp(1);}rs.close();pst.close();
www.percona.com42
Prepared Statement Reusepst = con.prepareStatement("SELECT MAX(`when`) FROM diskfree " + "WHERE `when` < ( NOW() - INTERVAL ? SECOND ) " + "AND `hostname` = ?");// thenpst.setBigDecimal(1, secondsBack);pst.setString(2, hostname);rs = pst.executeQuery();if (rs.next()) { then = rs.getTimestamp(1);}rs.close();// nowpst.setInt(1, 0);rs = pst.executeQuery();if (rs.next()) { now = rs.getTimestamp(1);}rs.close();pst.close();
www.percona.com43
Prepared Statement Reusepst = con.prepareStatement("SELECT MAX(`when`) FROM diskfree " + "WHERE `when` < ( NOW() - INTERVAL ? SECOND ) " + "AND `hostname` = ?");// thenpst.setBigDecimal(1, secondsBack);pst.setString(2, hostname);rs = pst.executeQuery();if (rs.next()) { then = rs.getTimestamp(1);}rs.close();// nowpst.setInt(1, 0);rs = pst.executeQuery();if (rs.next()) { now = rs.getTimestamp(1);}rs.close();pst.close();
www.percona.com44
Prepared Statement Reusepst = con.prepareStatement("SELECT MAX(`when`) FROM diskfree " + "WHERE `when` < ( NOW() - INTERVAL ? SECOND ) " + "AND `hostname` = ?");// thenpst.setBigDecimal(1, secondsBack);pst.setString(2, hostname);rs = pst.executeQuery();if (rs.next()) { then = rs.getTimestamp(1);}rs.close();// nowpst.setInt(1, 0);rs = pst.executeQuery();if (rs.next()) { now = rs.getTimestamp(1);}rs.close();pst.close();
www.percona.com45
Prepared Statement Reusepst = con.prepareStatement("SELECT MAX(`when`) FROM diskfree " + "WHERE `when` < ( NOW() - INTERVAL ? SECOND ) " + "AND `hostname` = ?");// thenpst.setBigDecimal(1, secondsBack);pst.setString(2, hostname);rs = pst.executeQuery();if (rs.next()) { then = rs.getTimestamp(1);}rs.close();// nowpst.setInt(1, 0);rs = pst.executeQuery();if (rs.next()) { now = rs.getTimestamp(1);}rs.close();pst.close();
www.percona.com46
Prepared Statement Batchespst=con.prepareStatement( // prepare insert "INSERT INTO diskfree (`hostname`,`file_system_name`,"+ "`total_space`,`space_used`,`space_free`,`percentage_used`,"+ "`file_system_root`,`when`) VALUES (?,?,?,?,?,?,?,?)");
for (DiskFreeEntry diskFreeEntry : getDiskFreeEntries()) { pst.setString ( 1, diskFreeEntry.hostname ); pst.setString ( 2, diskFreeEntry.fileSystemName ); pst.setLong ( 3, diskFreeEntry.totalSpace ); pst.setLong ( 4, diskFreeEntry.spaceUsed ); pst.setLong ( 5, diskFreeEntry.spaceFree ); pst.setBigDecimal( 6, diskFreeEntry.percentageUsed ); pst.setString ( 7, diskFreeEntry.fileSystemRoot ); pst.setTimestamp ( 8, when ); pst.addBatch(); // add to batch}int[] inserts=pst.executeBatch(); // execute batchint totalInserts=0;for (int i : inserts) totalInserts += i; // compute total
www.percona.com47
Prepared Statement Batchespst=con.prepareStatement( // prepare insert "INSERT INTO diskfree (`hostname`,`file_system_name`,"+ "`total_space`,`space_used`,`space_free`,`percentage_used`,"+ "`file_system_root`,`when`) VALUES (?,?,?,?,?,?,?,?)");
for (DiskFreeEntry diskFreeEntry : getDiskFreeEntries()) { pst.setString ( 1, diskFreeEntry.hostname ); pst.setString ( 2, diskFreeEntry.fileSystemName ); pst.setLong ( 3, diskFreeEntry.totalSpace ); pst.setLong ( 4, diskFreeEntry.spaceUsed ); pst.setLong ( 5, diskFreeEntry.spaceFree ); pst.setBigDecimal( 6, diskFreeEntry.percentageUsed ); pst.setString ( 7, diskFreeEntry.fileSystemRoot ); pst.setTimestamp ( 8, when ); pst.addBatch(); // add to batch}int[] inserts=pst.executeBatch(); // execute batchint totalInserts=0;for (int i : inserts) totalInserts += i; // compute total
www.percona.com48
Prepared Statement Batchespst=con.prepareStatement( // prepare insert "INSERT INTO diskfree (`hostname`,`file_system_name`,"+ "`total_space`,`space_used`,`space_free`,`percentage_used`,"+ "`file_system_root`,`when`) VALUES (?,?,?,?,?,?,?,?)");
for (DiskFreeEntry diskFreeEntry : getDiskFreeEntries()) { pst.setString ( 1, diskFreeEntry.hostname ); pst.setString ( 2, diskFreeEntry.fileSystemName ); pst.setLong ( 3, diskFreeEntry.totalSpace ); pst.setLong ( 4, diskFreeEntry.spaceUsed ); pst.setLong ( 5, diskFreeEntry.spaceFree ); pst.setBigDecimal( 6, diskFreeEntry.percentageUsed ); pst.setString ( 7, diskFreeEntry.fileSystemRoot ); pst.setTimestamp ( 8, when ); pst.addBatch(); // add to batch}int[] inserts=pst.executeBatch(); // execute batchint totalInserts=0;for (int i : inserts) totalInserts += i; // compute total
www.percona.com49
Prepared Statement Batchespst=con.prepareStatement( // prepare insert "INSERT INTO diskfree (`hostname`,`file_system_name`,"+ "`total_space`,`space_used`,`space_free`,`percentage_used`,"+ "`file_system_root`,`when`) VALUES (?,?,?,?,?,?,?,?)");
for (DiskFreeEntry diskFreeEntry : getDiskFreeEntries()) { pst.setString ( 1, diskFreeEntry.hostname ); pst.setString ( 2, diskFreeEntry.fileSystemName ); pst.setLong ( 3, diskFreeEntry.totalSpace ); pst.setLong ( 4, diskFreeEntry.spaceUsed ); pst.setLong ( 5, diskFreeEntry.spaceFree ); pst.setBigDecimal( 6, diskFreeEntry.percentageUsed ); pst.setString ( 7, diskFreeEntry.fileSystemRoot ); pst.setTimestamp ( 8, when ); pst.addBatch(); // add to batch}int[] inserts=pst.executeBatch(); // execute batchint totalInserts=0;for (int i : inserts) totalInserts += i; // compute total
www.percona.com50
Prepared Statement Batchespst=con.prepareStatement( // prepare insert "INSERT INTO diskfree (`hostname`,`file_system_name`,"+ "`total_space`,`space_used`,`space_free`,`percentage_used`,"+ "`file_system_root`,`when`) VALUES (?,?,?,?,?,?,?,?)");
for (DiskFreeEntry diskFreeEntry : getDiskFreeEntries()) { pst.setString ( 1, diskFreeEntry.hostname ); pst.setString ( 2, diskFreeEntry.fileSystemName ); pst.setLong ( 3, diskFreeEntry.totalSpace ); pst.setLong ( 4, diskFreeEntry.spaceUsed ); pst.setLong ( 5, diskFreeEntry.spaceFree ); pst.setBigDecimal( 6, diskFreeEntry.percentageUsed ); pst.setString ( 7, diskFreeEntry.fileSystemRoot ); pst.setTimestamp ( 8, when ); pst.addBatch(); // add to batch}int[] inserts=pst.executeBatch(); // execute batchint totalInserts=0;for (int i : inserts) totalInserts += i; // compute total
www.percona.com51
Prepared Statement Batchespst=con.prepareStatement( // prepare insert "INSERT INTO diskfree (`hostname`,`file_system_name`,"+ "`total_space`,`space_used`,`space_free`,`percentage_used`,"+ "`file_system_root`,`when`) VALUES (?,?,?,?,?,?,?,?)");
for (DiskFreeEntry diskFreeEntry : getDiskFreeEntries()) { pst.setString ( 1, diskFreeEntry.hostname ); pst.setString ( 2, diskFreeEntry.fileSystemName ); pst.setLong ( 3, diskFreeEntry.totalSpace ); pst.setLong ( 4, diskFreeEntry.spaceUsed ); pst.setLong ( 5, diskFreeEntry.spaceFree ); pst.setBigDecimal( 6, diskFreeEntry.percentageUsed ); pst.setString ( 7, diskFreeEntry.fileSystemRoot ); pst.setTimestamp ( 8, when ); pst.addBatch(); // add to batch}int[] inserts=pst.executeBatch(); // execute batchint totalInserts=0;for (int i : inserts) totalInserts += i; // compute total
www.percona.com52
Prepared Statement Batchespst=con.prepareStatement( // prepare insert "INSERT INTO diskfree (`hostname`,`file_system_name`,"+ "`total_space`,`space_used`,`space_free`,`percentage_used`,"+ "`file_system_root`,`when`) VALUES (?,?,?,?,?,?,?,?)");
for (DiskFreeEntry diskFreeEntry : getDiskFreeEntries()) { pst.setString ( 1, diskFreeEntry.hostname ); pst.setString ( 2, diskFreeEntry.fileSystemName ); pst.setLong ( 3, diskFreeEntry.totalSpace ); pst.setLong ( 4, diskFreeEntry.spaceUsed ); pst.setLong ( 5, diskFreeEntry.spaceFree ); pst.setBigDecimal( 6, diskFreeEntry.percentageUsed ); pst.setString ( 7, diskFreeEntry.fileSystemRoot ); pst.setTimestamp ( 8, when ); pst.addBatch(); // add to batch}int[] inserts=pst.executeBatch(); // execute batchint totalInserts=0;for (int i : inserts) totalInserts += i; // compute total
www.percona.com53
Prepared Statement Writes
int keepDays=30;String strKeepDays=dbp.getProperty("keep.days");if (strKeepDays != null) keepDays = new Integer(strKeepDays).intValue();
pst = con.prepareStatement( "DELETE FROM diskfree WHERE `when` < ( NOW() - INTERVAL ? DAY)");
pst.setInt(1, keepDays);pst.execute();
int updateCount=pst.getUpdateCount();if (updateCount > 0) System.out.println("Cleaned up "+updateCount+" old entries.");else System.out.println("No old entries to clean up.");
pst.close();
www.percona.com54
int keepDays=30;String strKeepDays=dbp.getProperty("keep.days");if (strKeepDays != null) keepDays = new Integer(strKeepDays).intValue();
pst = con.prepareStatement( "DELETE FROM diskfree WHERE `when` < ( NOW() - INTERVAL ? DAY)");
pst.setInt(1, keepDays);pst.execute();
int updateCount=pst.getUpdateCount();if (updateCount > 0) System.out.println("Cleaned up "+updateCount+" old entries.");else System.out.println("No old entries to clean up.");
pst.close();
Prepared Statement Writes
www.percona.com55
Prepared Statement Writes
int keepDays=30;String strKeepDays=dbp.getProperty("keep.days");if (strKeepDays != null) keepDays = new Integer(strKeepDays).intValue();
pst = con.prepareStatement( "DELETE FROM diskfree WHERE `when` < ( NOW() - INTERVAL ? DAY)");
pst.setInt(1, keepDays);pst.execute();
int updateCount=pst.getUpdateCount();if (updateCount > 0) System.out.println("Cleaned up "+updateCount+" old entries.");else System.out.println("No old entries to clean up.");
pst.close();
www.percona.com56
Prepared Statement Writes
int keepDays=30;String strKeepDays=dbp.getProperty("keep.days");if (strKeepDays != null) keepDays = new Integer(strKeepDays).intValue();
pst = con.prepareStatement( "DELETE FROM diskfree WHERE `when` < ( NOW() - INTERVAL ? DAY)");
pst.setInt(1, keepDays);pst.execute();
int updateCount=pst.getUpdateCount();if (updateCount > 0) System.out.println("Cleaned up "+updateCount+" old entries.");else System.out.println("No old entries to clean up.");
pst.close();
www.percona.com57
Prepared Statement Writes
int keepDays=30;String strKeepDays=dbp.getProperty("keep.days");if (strKeepDays != null) keepDays = new Integer(strKeepDays).intValue();
pst = con.prepareStatement( "DELETE FROM diskfree WHERE `when` < ( NOW() - INTERVAL ? DAY)");
pst.setInt(1, keepDays);pst.execute();
int updateCount=pst.getUpdateCount();if (updateCount > 0) System.out.println("Cleaned up "+updateCount+" old entries.");else System.out.println("No old entries to clean up.");
pst.close();
www.percona.com58
Performance parameters
Parameter What it doescachePrepStmts=true If true, cache prepared statements on client side
cacheCallableStmts=true If true, cache prepared stored procedure calls
CacheServerConfiguration=true
If true, reduces connect queries by caching server configuration variables.
useLocalSessionState=true If true, reduces setup queries by using the local session state
elideSetAutoCommits=true If true, only set autocommit if the server doesn't match the client autocommit setting.
AlwaysSendSetIsolation=false
If false, doesn't set the transaction isolation level on connect. Uses server default isolation level
enableQueryTimeouts=false If false, disables query timeouts
www.percona.com59
Performance parameters
Parameter What it does
cachePrepStmts=true If true, cache prepared statements on client side
cacheCallableStmts=true If true, cache prepared stored procedure calls
CacheServerConfiguration=true
If true, reduces connect queries by caching server configuration variables.
useLocalSessionState=true If true, reduces setup queries by using the local session state
elideSetAutoCommits=true If true, only set autocommit if the server doesn't match the client autocommit setting.
AlwaysSendSetIsolation=false
If false, doesn't set the transaction isolation level on connect. Uses server default isolation level
enableQueryTimeouts=false If false, disables query timeouts
useConfigs=maxPerformance
www.percona.com60
Debugging parameters
Parameter What it doesprofileSQL=true If true, log query execution times to the
configured logger.
gatherPerfMetrics=true If true, collect performance metrics to the configured logger.
useUsageAdvisor=true If true, inefficient use of JDBC and MySQL will logged to the configured logger as warnings.
logSlowQueries=true If true, 'slow' queries will be logged to the configured logger (slowQueryThresholdMillis)
explainSlowQueries=true If true, an 'EXPLAIN' statement for slow queries will be logged to the configured logger.
www.percona.com61
Debugging parameters
Parameter What it doesprofileSQL=true If true, log query execution times to the
configured logger.
gatherPerfMetrics=true If true, collect performance metrics to the configured logger.
useUsageAdvisor=true If true, inefficient use of JDBC and MySQL will logged to the configured logger as warnings.
logSlowQueries=true If true, 'slow' queries will be logged to the configured logger (slowQueryThresholdMillis)
explainSlowQueries=true If true, an 'EXPLAIN' statement for slow queries will be logged to the configured logger.
useConfigs=fullDebug
www.percona.com62
Other Handy Parameters
autoReconnect
characterEncoding
useInformationSchema
maxRows
www.percona.com63
Alternative JDBC Driver
MariaDB Java ClientMaintained-ed by MariaDB teamFork from Drizzle JDBCStable release 1.1.8Compatible with:
MySQL Percona Server / PXC MariaDB
www.percona.com64
Alternative JDBC Driver
ProsMaybe be faster in some casesIt is under active development
ConsNot as feature richNot as mature
www.percona.com65
What to learn about next
Connection Pooling
DBCP, C3P0, BoneCP
JNDI / Container Managed
DataSource, Spring
Object Relational Mapping
JPA, Hibernate, Spring
www.percona.com66 www.percona.com
THANK YOU