SlideShare a Scribd company logo
David Bennett
QA Engineer
April 15th
, 2015
Using MySQL with Java
Q2 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
17 www.percona.com
18 www.percona.com
19 www.percona.com
20 www.percona.com
21 www.percona.com
www.percona.com22
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 property
val The configuration property's value
* There are more advanced options for other protocols (IPV6,
Named Pipes), replication, failover, load balancing, etc...
www.percona.com23
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://dbserver
Connect 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/mydb
Connect the MySQL server dbserver on port 3307 using database mydb.
jdbc:mysql://dbserver/mydb
Connect the MySQL server dbserver on port 3306 using database mydb.
www.percona.com24
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://dbserver
Connect 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/mydb
Connect the MySQL server dbserver on port 3307 using database mydb.
jdbc:mysql://dbserver/mydb
Connect the MySQL server dbserver on port 3306 using database mydb.
www.percona.com25
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://dbserver
Connect 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/mydb
Connect the MySQL server dbserver on port 3307 using database mydb.
jdbc:mysql://dbserver/mydb
Connect the MySQL server dbserver on port 3306 using database mydb.
www.percona.com26
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://dbserver
Connect 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/mydb
Connect the MySQL server dbserver on port 3307 using database mydb.
jdbc:mysql://dbserver/mydb
Connect the MySQL server dbserver on port 3306 using database mydb.
www.percona.com27
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://dbserver
Connect 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/mydb
Connect the MySQL server dbserver on port 3307 using database mydb.
jdbc:mysql://dbserver/mydb
Connect the MySQL server dbserver on port 3306 using database mydb.
www.percona.com28
Connector/J parameters
Passing 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.com29
Connector/J parameters
Passing 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.com30
Connector/J parameters
Passing 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.com31
Connector/J parameters
Passing 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.com32
Generic JDBC App Example
import 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 %sn",rs.getString("version"));
}
rs.close(); st.close(); con.close();
}
}
www.percona.com33
Generic JDBC App Example
import 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 %sn",rs.getString("version"));
}
rs.close(); st.close(); con.close();
}
}
www.percona.com34
Generic JDBC App Example
import 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 %sn",rs.getString("version"));
}
rs.close(); st.close(); con.close();
}
}
www.percona.com35
Generic JDBC App Example
db.properties configured for MySQL:
# driver
class=com.mysql.jdbc.Driver
# connection url
url=jdbc:mysql://localhost
user=user
password=pwd
# parameters
autoReconnect=true
useConfigs=maxPerformance
# version query
versionQuery=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.com36
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.com37
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.java
github.com/dbpercona/DiskFreeChecker
www.percona.com38
Prepared Statement Query
pst=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 Query
pst=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 Query
pst=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.com41
Prepared Statement Query
pst=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.com42
Prepared Statement Query
pst=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.com43
Prepared Statement Query
pst=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.com44
Prepared Statement Query
pst=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.com45
Prepared Statement Reuse
pst = con.prepareStatement("SELECT MAX(`when`) FROM diskfree "
+ "WHERE `when` < ( NOW() - INTERVAL ? SECOND ) "
+ "AND `hostname` = ?");
// then
pst.setBigDecimal(1, secondsBack);
pst.setString(2, hostname);
rs = pst.executeQuery();
if (rs.next()) {
then = rs.getTimestamp(1);
}
rs.close();
// now
pst.setInt(1, 0);
rs = pst.executeQuery();
if (rs.next()) {
now = rs.getTimestamp(1);
}
rs.close();
pst.close();
www.percona.com46
Prepared Statement Reuse
pst = con.prepareStatement("SELECT MAX(`when`) FROM diskfree "
+ "WHERE `when` < ( NOW() - INTERVAL ? SECOND ) "
+ "AND `hostname` = ?");
// then
pst.setBigDecimal(1, secondsBack);
pst.setString(2, hostname);
rs = pst.executeQuery();
if (rs.next()) {
then = rs.getTimestamp(1);
}
rs.close();
// now
pst.setInt(1, 0);
rs = pst.executeQuery();
if (rs.next()) {
now = rs.getTimestamp(1);
}
rs.close();
pst.close();
www.percona.com47
Prepared Statement Reuse
pst = con.prepareStatement("SELECT MAX(`when`) FROM diskfree "
+ "WHERE `when` < ( NOW() - INTERVAL ? SECOND ) "
+ "AND `hostname` = ?");
// then
pst.setBigDecimal(1, secondsBack);
pst.setString(2, hostname);
rs = pst.executeQuery();
if (rs.next()) {
then = rs.getTimestamp(1);
}
rs.close();
// now
pst.setInt(1, 0);
rs = pst.executeQuery();
if (rs.next()) {
now = rs.getTimestamp(1);
}
rs.close();
pst.close();
www.percona.com48
Prepared Statement Reuse
pst = con.prepareStatement("SELECT MAX(`when`) FROM diskfree "
+ "WHERE `when` < ( NOW() - INTERVAL ? SECOND ) "
+ "AND `hostname` = ?");
// then
pst.setBigDecimal(1, secondsBack);
pst.setString(2, hostname);
rs = pst.executeQuery();
if (rs.next()) {
then = rs.getTimestamp(1);
}
rs.close();
// now
pst.setInt(1, 0);
rs = pst.executeQuery();
if (rs.next()) {
now = rs.getTimestamp(1);
}
rs.close();
pst.close();
www.percona.com49
Prepared Statement Reuse
pst = con.prepareStatement("SELECT MAX(`when`) FROM diskfree "
+ "WHERE `when` < ( NOW() - INTERVAL ? SECOND ) "
+ "AND `hostname` = ?");
// then
pst.setBigDecimal(1, secondsBack);
pst.setString(2, hostname);
rs = pst.executeQuery();
if (rs.next()) {
then = rs.getTimestamp(1);
}
rs.close();
// now
pst.setInt(1, 0);
rs = pst.executeQuery();
if (rs.next()) {
now = rs.getTimestamp(1);
}
rs.close();
pst.close();
www.percona.com50
Prepared Statement Reuse
pst = con.prepareStatement("SELECT MAX(`when`) FROM diskfree "
+ "WHERE `when` < ( NOW() - INTERVAL ? SECOND ) "
+ "AND `hostname` = ?");
// then
pst.setBigDecimal(1, secondsBack);
pst.setString(2, hostname);
rs = pst.executeQuery();
if (rs.next()) {
then = rs.getTimestamp(1);
}
rs.close();
// now
pst.setInt(1, 0);
rs = pst.executeQuery();
if (rs.next()) {
now = rs.getTimestamp(1);
}
rs.close();
pst.close();
www.percona.com51
Prepared Statement Batches
pst=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 batch
int totalInserts=0;
for (int i : inserts) totalInserts += i; // compute total
www.percona.com52
Prepared Statement Batches
pst=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 batch
int totalInserts=0;
for (int i : inserts) totalInserts += i; // compute total
www.percona.com53
Prepared Statement Batches
pst=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 batch
int totalInserts=0;
for (int i : inserts) totalInserts += i; // compute total
www.percona.com54
Prepared Statement Batches
pst=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 batch
int totalInserts=0;
for (int i : inserts) totalInserts += i; // compute total
www.percona.com55
Prepared Statement Batches
pst=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 batch
int totalInserts=0;
for (int i : inserts) totalInserts += i; // compute total
www.percona.com56
Prepared Statement Batches
pst=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 batch
int totalInserts=0;
for (int i : inserts) totalInserts += i; // compute total
www.percona.com57
Prepared Statement Batches
pst=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 batch
int totalInserts=0;
for (int i : inserts) totalInserts += i; // compute total
www.percona.com58
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.com59
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.com60
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.com61
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.com62
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.com63
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
www.percona.com64
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.com65
Debugging parameters
Parameter What it does
profileSQL=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.com66
Debugging parameters
Parameter What it does
profileSQL=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.com67
Other Handy Parameters
●
autoReconnect
●
characterEncoding
●
useInformationSchema
●
maxRows
www.percona.com68
Alternative JDBC Driver
●
MariaDB Java Client

Maintained-ed by MariaDB team

Fork from Drizzle JDBC

Stable release 1.1.8

Compatible with:
✔
MySQL
✔
Percona Server / PXC
✔
MariaDB
www.percona.com69
Alternative JDBC Driver
●
Pros

Maybe be faster in some cases

It is under active development

Cons

Not as feature rich

Not as mature
www.percona.com70
What to learn about next
●
Connection Pooling
●
DBCP, C3P0, BoneCP
●
JNDI / Container Managed
●
DataSource, Spring
●
Object Relational Mapping
●
JPA, Hibernate, Spring
www.percona.com71 www.percona.com
THANK YOU

More Related Content

PPT
Plmce2015 java 101 - david bennett
PDF
MySQL JSON Functions
PDF
Ohio Linux Fest -- MySQL's NoSQL
PDF
MySQL Utilities -- PyTexas 2015
PDF
PNWPHP -- What are Databases so &#%-ing Difficult
PDF
MySQL's NoSQL -- Texas Linuxfest August 22nd 2015
PDF
Why MySQL Replication Fails, and How to Get it Back
PDF
MySQL 8.0.21 - New Features Summary
Plmce2015 java 101 - david bennett
MySQL JSON Functions
Ohio Linux Fest -- MySQL's NoSQL
MySQL Utilities -- PyTexas 2015
PNWPHP -- What are Databases so &#%-ing Difficult
MySQL's NoSQL -- Texas Linuxfest August 22nd 2015
Why MySQL Replication Fails, and How to Get it Back
MySQL 8.0.21 - New Features Summary

What's hot (20)

PDF
10x Performance Improvements - A Case Study
PDF
OpenWorld 2014 - Schema Management: versioning and automation with Puppet and...
PDF
How Booking.com avoids and deals with replication lag
PDF
External Language Stored Procedures for MySQL
PDF
Using Perl Stored Procedures for MariaDB
PDF
Perl Stored Procedures for MySQL (2009)
PPTX
MySQL Replication Overview -- PHPTek 2016
PDF
The Full MySQL and MariaDB Parallel Replication Tutorial
PDF
What you wanted to know about MySQL, but could not find using inernal instrum...
PPTX
Java Unit Testing with Unitils
PDF
Lessons Learned: Troubleshooting Replication
PDF
Intro ProxySQL
PDF
Using advanced options in MariaDB Connector/J
PDF
MySQL as a Document Store
PDF
Open Source World June '21 -- JSON Within a Relational Database
PDF
Developers’ mDay 2021: Bogdan Kecman, Oracle – MySQL nekad i sad
PDF
MySQL Cluster 8.0 tutorial text
PDF
ProxySQL High Availability (Clustering)
PDF
4.3 MySQL + PHP
PDF
자바 웹 개발 시작하기 (1주차 : 웹 어플리케이션 체험 실습)
10x Performance Improvements - A Case Study
OpenWorld 2014 - Schema Management: versioning and automation with Puppet and...
How Booking.com avoids and deals with replication lag
External Language Stored Procedures for MySQL
Using Perl Stored Procedures for MariaDB
Perl Stored Procedures for MySQL (2009)
MySQL Replication Overview -- PHPTek 2016
The Full MySQL and MariaDB Parallel Replication Tutorial
What you wanted to know about MySQL, but could not find using inernal instrum...
Java Unit Testing with Unitils
Lessons Learned: Troubleshooting Replication
Intro ProxySQL
Using advanced options in MariaDB Connector/J
MySQL as a Document Store
Open Source World June '21 -- JSON Within a Relational Database
Developers’ mDay 2021: Bogdan Kecman, Oracle – MySQL nekad i sad
MySQL Cluster 8.0 tutorial text
ProxySQL High Availability (Clustering)
4.3 MySQL + PHP
자바 웹 개발 시작하기 (1주차 : 웹 어플리케이션 체험 실습)
Ad

Similar to 34 using mysql with java (20)

PDF
Core Java Programming Language (JSE) : Chapter XIII - JDBC
PDF
Chapter 5 JDBC.pdf for stufent of computer andtudent It s
PPT
PPTX
Jdbc introduction
PPTX
Java Database Connectivity (JDBC) ppt by Aamir Rafique.pptx
PPT
Jdbc sasidhar
PDF
DOC
PPT
JDBC java for learning java for learn.ppt
PDF
Overview Of JDBC
PPTX
Amr Mohamed Abd Elhamid_JAVA_JDBCData.pptx
PDF
Jdbc[1]
PDF
JDBC programming
PPT
JDBC.ppt
PDF
java arlow jdbc tutorial(java programming tutorials)
PDF
Introduction to JDBC and database access in web applications
PPSX
JDBC: java DataBase connectivity
PPT
JDBC.ppt
Core Java Programming Language (JSE) : Chapter XIII - JDBC
Chapter 5 JDBC.pdf for stufent of computer andtudent It s
Jdbc introduction
Java Database Connectivity (JDBC) ppt by Aamir Rafique.pptx
Jdbc sasidhar
JDBC java for learning java for learn.ppt
Overview Of JDBC
Amr Mohamed Abd Elhamid_JAVA_JDBCData.pptx
Jdbc[1]
JDBC programming
JDBC.ppt
java arlow jdbc tutorial(java programming tutorials)
Introduction to JDBC and database access in web applications
JDBC: java DataBase connectivity
JDBC.ppt
Ad

Recently uploaded (20)

PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Unlocking AI with Model Context Protocol (MCP)
PPTX
TLE Review Electricity (Electricity).pptx
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PPTX
1. Introduction to Computer Programming.pptx
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PDF
Approach and Philosophy of On baking technology
PPTX
OMC Textile Division Presentation 2021.pptx
PPT
Teaching material agriculture food technology
PPTX
Tartificialntelligence_presentation.pptx
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PPTX
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PPTX
Group 1 Presentation -Planning and Decision Making .pptx
PDF
Getting Started with Data Integration: FME Form 101
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Mushroom cultivation and it's methods.pdf
Digital-Transformation-Roadmap-for-Companies.pptx
Unlocking AI with Model Context Protocol (MCP)
TLE Review Electricity (Electricity).pptx
Per capita expenditure prediction using model stacking based on satellite ima...
Diabetes mellitus diagnosis method based random forest with bat algorithm
1. Introduction to Computer Programming.pptx
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
NewMind AI Weekly Chronicles - August'25-Week II
Approach and Philosophy of On baking technology
OMC Textile Division Presentation 2021.pptx
Teaching material agriculture food technology
Tartificialntelligence_presentation.pptx
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
Reach Out and Touch Someone: Haptics and Empathic Computing
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Group 1 Presentation -Planning and Decision Making .pptx
Getting Started with Data Integration: FME Form 101
Advanced methodologies resolving dimensionality complications for autism neur...
Mushroom cultivation and it's methods.pdf

34 using mysql with java

  • 1. David Bennett QA Engineer April 15th , 2015 Using MySQL with Java Q2 2014
  • 2. www.percona.com2 Who are you? ● Java Experts, Intermediate, Beginners ● MySQL Experts, Intermediate, Beginners ● Developers, DBAs, System Admins ● Just interested
  • 3. 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
  • 4. www.percona.com4 Basic Topology Java Application (Web, Service, Desktop) Java Runtime Engine (JRE) JDBC Interface JDBC Driver (Connector/J) MySQL
  • 5. 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.
  • 6. 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
  • 7. 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(); } }
  • 8. 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(); } }
  • 9. 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(); } }
  • 10. 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(); } }
  • 11. 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(); } }
  • 12. 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(); } }
  • 13. 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(); } }
  • 14. 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(); } }
  • 15. 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(); } }
  • 22. www.percona.com22 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 property val The configuration property's value * There are more advanced options for other protocols (IPV6, Named Pipes), replication, failover, load balancing, etc...
  • 23. www.percona.com23 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://dbserver Connect 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/mydb Connect the MySQL server dbserver on port 3307 using database mydb. jdbc:mysql://dbserver/mydb Connect the MySQL server dbserver on port 3306 using database mydb.
  • 24. www.percona.com24 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://dbserver Connect 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/mydb Connect the MySQL server dbserver on port 3307 using database mydb. jdbc:mysql://dbserver/mydb Connect the MySQL server dbserver on port 3306 using database mydb.
  • 25. www.percona.com25 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://dbserver Connect 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/mydb Connect the MySQL server dbserver on port 3307 using database mydb. jdbc:mysql://dbserver/mydb Connect the MySQL server dbserver on port 3306 using database mydb.
  • 26. www.percona.com26 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://dbserver Connect 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/mydb Connect the MySQL server dbserver on port 3307 using database mydb. jdbc:mysql://dbserver/mydb Connect the MySQL server dbserver on port 3306 using database mydb.
  • 27. www.percona.com27 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://dbserver Connect 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/mydb Connect the MySQL server dbserver on port 3307 using database mydb. jdbc:mysql://dbserver/mydb Connect the MySQL server dbserver on port 3306 using database mydb.
  • 28. www.percona.com28 Connector/J parameters Passing 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:
  • 29. www.percona.com29 Connector/J parameters Passing 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:
  • 30. www.percona.com30 Connector/J parameters Passing 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:
  • 31. www.percona.com31 Connector/J parameters Passing 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:
  • 32. www.percona.com32 Generic JDBC App Example import 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 %sn",rs.getString("version")); } rs.close(); st.close(); con.close(); } }
  • 33. www.percona.com33 Generic JDBC App Example import 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 %sn",rs.getString("version")); } rs.close(); st.close(); con.close(); } }
  • 34. www.percona.com34 Generic JDBC App Example import 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 %sn",rs.getString("version")); } rs.close(); st.close(); con.close(); } }
  • 35. www.percona.com35 Generic JDBC App Example db.properties configured for MySQL: # driver class=com.mysql.jdbc.Driver # connection url url=jdbc:mysql://localhost user=user password=pwd # parameters autoReconnect=true useConfigs=maxPerformance # version query versionQuery=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
  • 36. www.percona.com36 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.
  • 37. www.percona.com37 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.java github.com/dbpercona/DiskFreeChecker
  • 38. www.percona.com38 Prepared Statement Query pst=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();
  • 39. www.percona.com39 Prepared Statement Query pst=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();
  • 40. www.percona.com40 Prepared Statement Query pst=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();
  • 41. www.percona.com41 Prepared Statement Query pst=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();
  • 42. www.percona.com42 Prepared Statement Query pst=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();
  • 43. www.percona.com43 Prepared Statement Query pst=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();
  • 44. www.percona.com44 Prepared Statement Query pst=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();
  • 45. www.percona.com45 Prepared Statement Reuse pst = con.prepareStatement("SELECT MAX(`when`) FROM diskfree " + "WHERE `when` < ( NOW() - INTERVAL ? SECOND ) " + "AND `hostname` = ?"); // then pst.setBigDecimal(1, secondsBack); pst.setString(2, hostname); rs = pst.executeQuery(); if (rs.next()) { then = rs.getTimestamp(1); } rs.close(); // now pst.setInt(1, 0); rs = pst.executeQuery(); if (rs.next()) { now = rs.getTimestamp(1); } rs.close(); pst.close();
  • 46. www.percona.com46 Prepared Statement Reuse pst = con.prepareStatement("SELECT MAX(`when`) FROM diskfree " + "WHERE `when` < ( NOW() - INTERVAL ? SECOND ) " + "AND `hostname` = ?"); // then pst.setBigDecimal(1, secondsBack); pst.setString(2, hostname); rs = pst.executeQuery(); if (rs.next()) { then = rs.getTimestamp(1); } rs.close(); // now pst.setInt(1, 0); rs = pst.executeQuery(); if (rs.next()) { now = rs.getTimestamp(1); } rs.close(); pst.close();
  • 47. www.percona.com47 Prepared Statement Reuse pst = con.prepareStatement("SELECT MAX(`when`) FROM diskfree " + "WHERE `when` < ( NOW() - INTERVAL ? SECOND ) " + "AND `hostname` = ?"); // then pst.setBigDecimal(1, secondsBack); pst.setString(2, hostname); rs = pst.executeQuery(); if (rs.next()) { then = rs.getTimestamp(1); } rs.close(); // now pst.setInt(1, 0); rs = pst.executeQuery(); if (rs.next()) { now = rs.getTimestamp(1); } rs.close(); pst.close();
  • 48. www.percona.com48 Prepared Statement Reuse pst = con.prepareStatement("SELECT MAX(`when`) FROM diskfree " + "WHERE `when` < ( NOW() - INTERVAL ? SECOND ) " + "AND `hostname` = ?"); // then pst.setBigDecimal(1, secondsBack); pst.setString(2, hostname); rs = pst.executeQuery(); if (rs.next()) { then = rs.getTimestamp(1); } rs.close(); // now pst.setInt(1, 0); rs = pst.executeQuery(); if (rs.next()) { now = rs.getTimestamp(1); } rs.close(); pst.close();
  • 49. www.percona.com49 Prepared Statement Reuse pst = con.prepareStatement("SELECT MAX(`when`) FROM diskfree " + "WHERE `when` < ( NOW() - INTERVAL ? SECOND ) " + "AND `hostname` = ?"); // then pst.setBigDecimal(1, secondsBack); pst.setString(2, hostname); rs = pst.executeQuery(); if (rs.next()) { then = rs.getTimestamp(1); } rs.close(); // now pst.setInt(1, 0); rs = pst.executeQuery(); if (rs.next()) { now = rs.getTimestamp(1); } rs.close(); pst.close();
  • 50. www.percona.com50 Prepared Statement Reuse pst = con.prepareStatement("SELECT MAX(`when`) FROM diskfree " + "WHERE `when` < ( NOW() - INTERVAL ? SECOND ) " + "AND `hostname` = ?"); // then pst.setBigDecimal(1, secondsBack); pst.setString(2, hostname); rs = pst.executeQuery(); if (rs.next()) { then = rs.getTimestamp(1); } rs.close(); // now pst.setInt(1, 0); rs = pst.executeQuery(); if (rs.next()) { now = rs.getTimestamp(1); } rs.close(); pst.close();
  • 51. www.percona.com51 Prepared Statement Batches pst=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 batch int totalInserts=0; for (int i : inserts) totalInserts += i; // compute total
  • 52. www.percona.com52 Prepared Statement Batches pst=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 batch int totalInserts=0; for (int i : inserts) totalInserts += i; // compute total
  • 53. www.percona.com53 Prepared Statement Batches pst=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 batch int totalInserts=0; for (int i : inserts) totalInserts += i; // compute total
  • 54. www.percona.com54 Prepared Statement Batches pst=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 batch int totalInserts=0; for (int i : inserts) totalInserts += i; // compute total
  • 55. www.percona.com55 Prepared Statement Batches pst=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 batch int totalInserts=0; for (int i : inserts) totalInserts += i; // compute total
  • 56. www.percona.com56 Prepared Statement Batches pst=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 batch int totalInserts=0; for (int i : inserts) totalInserts += i; // compute total
  • 57. www.percona.com57 Prepared Statement Batches pst=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 batch int totalInserts=0; for (int i : inserts) totalInserts += i; // compute total
  • 58. www.percona.com58 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();
  • 59. www.percona.com59 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
  • 60. www.percona.com60 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();
  • 61. www.percona.com61 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();
  • 62. www.percona.com62 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();
  • 63. www.percona.com63 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
  • 64. www.percona.com64 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
  • 65. www.percona.com65 Debugging parameters Parameter What it does profileSQL=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.
  • 66. www.percona.com66 Debugging parameters Parameter What it does profileSQL=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
  • 68. www.percona.com68 Alternative JDBC Driver ● MariaDB Java Client  Maintained-ed by MariaDB team  Fork from Drizzle JDBC  Stable release 1.1.8  Compatible with: ✔ MySQL ✔ Percona Server / PXC ✔ MariaDB
  • 69. www.percona.com69 Alternative JDBC Driver ● Pros  Maybe be faster in some cases  It is under active development  Cons  Not as feature rich  Not as mature
  • 70. www.percona.com70 What to learn about next ● Connection Pooling ● DBCP, C3P0, BoneCP ● JNDI / Container Managed ● DataSource, Spring ● Object Relational Mapping ● JPA, Hibernate, Spring