JDBC连接常用数据库

1、Oracle8/8i/9i数据库(thin模式)

    Class.forName(“oracle.jdbc.driver.OracleDriver”).newInstance();

    String url=”jdbc:oracle:thin:@localhost:1521:orcl”;

    //orcl为数据库的SID

    String user=”test”;

    String password=”test”;

    Connection conn= DriverManager.getConnection(url,user,password);

    2、DB2数据库

    Class.forName(“com.ibm.db2.jdbc.app.DB2Driver “).newInstance();

    String url=”jdbc:db2://localhost:5000/sample”;

    //sample为你的数据库名

    String user=”admin”;

    String password=””;

    Connection conn= DriverManager.getConnection(url,user,password);

    3、Sql Server7.0/2000数据库

    Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”).newInstance();

    String url=”jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb”;

    //mydb为数据库

    String user=”sa”;

    String password=””;

    Connection conn= DriverManager.getConnection(url,user,password);

    4、Sybase数据库

    Class.forName(“com.sybase.jdbc.SybDriver”).newInstance();

    String url =” jdbc:sybase:Tds:localhost:5007/myDB”;

    //myDB为你的数据库名

    Properties sysProps = System.getProperties();

    SysProps.put(“user”,”userid”);

    SysProps.put(“password”,”user_password”);

    Connection conn= DriverManager.getConnection(url, SysProps);

    5、Informix数据库

    Class.forName(“com.informix.jdbc.IfxDriver”).newInstance();

    String url =

    “jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;

    user=testuser;password=testpassword”;

    //myDB为数据库名

    Connection conn= DriverManager.getConnection(url);

    6、MySQL数据库

    Class.forName(“org.gjt.mm.mysql.Driver”).newInstance();

    String url =”jdbc:mysql://localhost/myDB user=soft&password=soft1234&useUnicod

    e=true&characterEncoding=8859_1″

    //myDB为数据库名

    Connection conn= DriverManager.getConnection(url);

    7、PostgreSQL数据库

    Class.forName(“org.postgresql.Driver”).newInstance();

    String url =”jdbc:postgresql://localhost/myDB”

    //myDB为数据库名

    String user=”myuser”;

    String password=”mypassword”;

    Connection conn= DriverManager.getConnection(url,user,password);

mysql命令不常用的参数

mysql -e   这个参数是告诉mysql 我只要执行”-e” 后面的某个命令,而不是要通过mysql连接到mysql server上面,此参数在写一些基本的mysql检查和监控的脚本中非常有用

mysql -H,–htlm   这个参数 select出来的结果都会按照Html格式输出,在某些场后下,比如希望用Html格式导出报表文件时

mysql -X,–xml    这个参数 select出来的结果都会按照Xml格式输出,在某些场后下,比如希望用Xml格式导出报表文件时

mysql –prompt 这个参数对于维护人员很重要,主要功能是定制自己的mysql提示符显示内容,默认的mysql的提示符是>   如果我们使用mysql时,自定义提示符,如 mysql –prompt “\\u@\\h:\\d \\r:\\m:\\s>”   它的显示效果就是这样:root@localhost:db2 10:53:25> 是不是很方面   能马上知道现在用的是那个数据库!

mysql –tee 这个参数对于运维人员非常有用的参数,用来告诉Mysql将所有输入和输出内容都记录到文件里,当做有些较大维护变更的时候,为了方便查找,最好是将这个操作过程所有输入和输出都记录下来 例如:mysql –tee=/root/mysql.txt

————————————-

-D 指定 数据库名称

-P 指定 端口号

-p 指定 密码

hibernate的主键生成方式

Generator

可选的<generator>子元素是一个Java类的名字, 用来为该持久化类的实例生成唯一的标识。如果这个生成器实例需要某些配置值或者初始化参数, <param>元素来传递。

 

<id name=”id” type=”long” column=”cat_id”>

        <generator class=”org.hibernate.id.TableHiLoGenerator”>

                <param name=”table”>uid_table</param>

                <param name=”column”>next_hi_value_column</param>

        </generator>

</id>

所有的生成器都实现net.sf.hibernate.id.IdentifierGenerator接口。 这是一个非常简单的接口;某些应用程序可以选择提供他们自己特定的实现。当然, Hibernate提供了很多内置的实现。下面是一些内置生成器的快捷名字:

 

increment

用于为long, short或者int类型生成 唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 在集群下不要使用。

 

identity

DB2,MySQL, MS SQL Server, SybaseHypersonicSQL的内置标识字段提供支持。 返回的标识符是long, short 或者int类型的。

 

sequence

DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence) 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。

 

hilo

使用一个高/低位算法高效的生成long, short 或者 int类型的标识符。给定一个表和字段(默认分别是是 hibernate_unique_key next_hi)作为高位值的来源。 /低位算法生成的标识符只在一个特定的数据库中是唯一的。

 

seqhilo

使用一个高/低位算法来高效的生成long, short 或者 int类型的标识符,给定一个数据库序列(sequence)的名字。

 

uuid

用一个128-bitUUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个3216进制数字的字符串。

 

guid

MS SQL Server MySQL 中使用数据库生成的GUID字符串。

 

native

根据底层数据库的能力选择identity, sequence 或者hilo中的一个。

 

assigned

让应用程序在save()之前为对象分配一个标示符。这是 <generator>元素没有指定时的默认生成策略。

 

select

通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个主键。

 

foreign

使用另外一个相关联的对象的标识符。通常和<one-to-one>联合起来使用。

hibernate主键生成器解释

Generator
可选的<generator>子元素是一个Java类的名字, 用来为该持久化类的实例生成唯一的标识。如果这个生成器实例需要某些配置值或者初始化参数, 用<param>元素来传递。

<id name=”id” type=”long” column=”cat_id”>
        <generator class=”org.hibernate.id.TableHiLoGenerator”>
                <param name=”table”>uid_table</param>
                <param name=”column”>next_hi_value_column</param>
        </generator>
</id>
所有的生成器都实现net.sf.hibernate.id.IdentifierGenerator接口。 这是一个非常简单的接口;某些应用程序可以选择提供他们自己特定的实现。当然, Hibernate提供了很多内置的实现。下面是一些内置生成器的快捷名字:

increment
用于为long, short或者int类型生成 唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 在集群下不要使用。

identity
对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。 返回的标识符是long, short 或者int类型的。

sequence
在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。

hilo
使用一个高/低位算法高效的生成long, short 或者 int类型的标识符。给定一个表和字段(默认分别是是 hibernate_unique_key 和next_hi)作为高位值的来源。 高/低位算法生成的标识符只在一个特定的数据库中是唯一的。

seqhilo
使用一个高/低位算法来高效的生成long, short 或者 int类型的标识符,给定一个数据库序列(sequence)的名字。

uuid
用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。

guid
在MS SQL Server 和 MySQL 中使用数据库生成的GUID字符串。

native
根据底层数据库的能力选择identity, sequence 或者hilo中的一个。

assigned
让应用程序在save()之前为对象分配一个标示符。这是 <generator>元素没有指定时的默认生成策略。

select
通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个主键。

foreign
使用另外一个相关联的对象的标识符。通常和<one-to-one>联合起来使用。

 

 

 

 

 

 

 

 

 

 

 

 

 

使用MMM搭建Mysql同步高可用性

先介绍下MMM
MMM是 mysql-master-master的缩写。
MMM项目来自 Google:http://code.google.com/p/mysql-master-master

MySQL本身没有提供replication failover的解决方案,那么如何使Replication方案具有HA的功能呢,那就是MMM。
大家都知道mysql的同步机制在解决实际问题上具有很高的可行性,特别对读写负载比较高的web2.0来说,那么在实际应用中必须保证mysql的稳定性及性能。

Master-Master Replication
1、使用两个MySQL数据库db1,db2,互为Master和Slave,即:
一边db1作为db2的master,一旦有数据写向db0时,db2定时从db1更新
另一边db2也作为db1的master,一旦有数据写向db2时,db1也定时从db2获得更新

2、但从AppServer的角度来说,同时只有一个结点db1扮演Master,另外一个结点db2扮演Slave,不能同时两个结点扮演Master。即AppSever总是把write操作分配某个数据库(db1),除非db1 failed,被切换。

3、如果扮演Slave的数据库结点db2 Failed了:
a)此时appServer要能够把所有的read,write分配给db1,read操作不再指向db2
b)一旦db2恢复过来后,继续充当Slave角色,并告诉AppServer可以将read分配给它了

4、如果扮演Master的数据库结点db1 Failed了
a)此时appServer要能够把所有的写操作从db1切换分配给db2,也就是切换Master由db2充当
b)db1恢复过来后,充当Slave的角色,Master由db2继续扮演

MMM利用了虚拟IP的技术:1个网卡可以同时使用多个IP。
(所以使用MMM时,需要2*n+1个IP,n为mysql数据库结点个数,包括master,slave)

MMM有3个重要的器件:
1、mmmd_mon – 数据库控制节点运行。
2、mmm_control – 数据库控制节点运行。
3、mmmd_agent – 数据库节点(master/slave)运行。

本文环境:
server1 ip: 192.168.1.225 ; virtual read ip:192.168.1.229
server2 ip: 192.168.1.226 ; virtual read ip:192.168.1.230

server3 ip: 192.168.1.227
virtual write ip: 192.168.1.231

配置过程很简单,
server1 server2 replication双向 master-master
server1 server2 安装mmm并配置mmm_agent.conf
server3 安装mmm并配置mmm_mon.conf

1,首先我们要先配置好master-master双向同步,这一步就不多说了。
2,安装部署MMM
3台服务器都要安装MMM软件,安装过程如下:

安装如下perl模块,为MMM安装做好准备,
cpan Algorithm::Diff
cpan Proc::Daemon
cpan Time::HiRes
cpan DBI
cpan DBD::mysql

wget http://mysql-master-master.googlecode.com/files/mmm-1.0-pre2.tar.bz2
tar xzf mmm-1.0-pre2.tar.bz2
cd mmm-1.0-pre2
./install.pl

3,在server1上配置MMM
修改配置 /usr/local/mmm/etc/mmm_agent.conf,如下:

#
# Master-Master Manager config (agent)
#

# Debug mode
debug no

# Paths
pid_path /usr/local/mmm/var/mmmd_agent.pid
bin_path /usr/local/mmm/bin

# Logging setup
log mydebug
file /usr/local/mmm/var/mmm-debug.log
level debug

log mytraps
file /usr/local/mmm/var/mmm-traps.log
level trap

# MMMD command socket tcp-port and ip
bind_port 9989

# Cluster interface
cluster_interface eth0

# Define current server id
this db1
mode master

# For masters
peer db2

# Cluster hosts addresses and access params
host db1
ip 192.168.1.225
port 3306
user rep_agent
password RepAgent

host db2
ip 192.168.1.226
port 3306
user rep_agent
password RepAgent

GRANT ALL PRIVILEGES on *.* to ‘rep_agent’@’%′ identified by ‘RepAgent’;
GRANT ALL PRIVILEGES on *.* to ‘rep_monitor’@’%’ identified by ‘RepMonitor’;

 

 

3,在server2上配置MMM
修改配置 /usr/local/mmm/etc/mmm_agent.conf,如下:

#
# Master-Master Manager config (agent)
#

# Debug mode
debug no

# Paths
pid_path /usr/local/mmm/var/mmmd_agent.pid
bin_path /usr/local/mmm/bin

# Logging setup
log mydebug
file /usr/local/mmm/var/mmm-debug.log
level debug

log mytraps
file /usr/local/mmm/var/mmm-traps.log
level trap

# MMMD command socket tcp-port and ip
bind_port 9989

# Cluster interface
cluster_interface eth0

# Define current server id
this db2
mode master

# For masters
peer db1

# Cluster hosts addresses and access params
host db1
ip 192.168.1.225
port 3306
user rep_agent
password RepAgent

host db2
ip 192.168.1.226
port 3306
user rep_agent
password RepAgent

GRANT ALL PRIVILEGES on *.* to ‘rep_agent’@’%′ identified by ‘RepAgent’;
GRANT ALL PRIVILEGES on *.* to ‘rep_monitor’@’%’ identified by ‘RepMonitor’;

3,在server3上配置MMM
修改配置 /usr/local/mmm/etc/mmm_mon.conf,如下:

#
# Master-Master Manager config (monitor)
#

# Debug mode
debug no

# Paths
pid_path /usr/local/mmm/var/mmmd.pid
status_path /usr/local/mmm/var/mmmd.status
bin_path /usr/local/mmm/bin

# Logging setup
log mydebug
file /usr/local/mmm/var/mmm-debug.log
level debug

log mytraps
file /usr/local/mmm/var/mmm-traps.log
level trap
email root@localhost

# MMMD command socket tcp-port
bind_port 9988
agent_port 9989
monitor_ip 127.0.0.1

# Cluster interface
cluster_interface eth0

# Cluster hosts addresses and access params
host db1
ip 192.168.1.225
port 3306
user rep_monitor
password RepMonitor
mode master
peer db2

host db2
ip 192.168.1.226
port 3306
user rep_monitor
password RepMonitor
mode master
peer db1

#
# Define roles
#

active_master_role writer

# Mysql Reader role
role reader
mode balanced
servers db1, db2
ip 192.168.1.229, 192.168.1.230

# Mysql Writer role
role writer
mode exclusive
servers db1, db2
ip 192.168.1.231

#
# Checks parameters
#

# Ping checker
check ping
check_period 1
trap_period 5
timeout 2

# Mysql checker
# (restarts after 10000 checks to prevent memory leaks)
check mysql
check_period 1
trap_period 2
timeout 2
restart_after 10000

# Mysql replication backlog checker
# (restarts after 10000 checks to prevent memory leaks)
check rep_backlog
check_period 5
trap_period 10
max_backlog 60
timeout 2
restart_after 10000

# Mysql replication threads checker
# (restarts after 10000 checks to prevent memory leaks)
check rep_threads
check_period 1
trap_period 5
timeout 2
restart_after 10000

启动
server1 与 server2上分别启动mmmd_agent
[root@localhost ~]# mmmd_agent
[root@localhost ~]# netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:9989 0.0.0.0:* LISTEN 26010/perl

出现9989端口说明启动成功。

server3上启动mmmd_mon
[root@localhost etc]# mmmd_mon
Reading config file: ‘mmm_mon.conf’
$VAR1 = {
‘db2’ => {
‘roles’ => [
‘reader(192.168.1.229;)’
],
‘version’ => ‘0’,
‘state’ => ‘ONLINE’
},
‘db1’ => {
‘roles’ => [
‘reader(192.168.1.230;)’,
‘writer(192.168.1.231;)’
],
‘version’ => ‘0’,
‘state’ => ‘ONLINE’
}
};
Role: ‘reader(192.168.1.229;)’
Adding role: ‘reader’ with ip ‘192.168.1.229’
Role: ‘reader(192.168.1.230;)’
Adding role: ‘reader’ with ip ‘192.168.1.230’
Role: ‘writer(192.168.1.231;)’
Adding role: ‘writer’ with ip ‘192.168.1.231’

在管理节点上(server3)启动db节点:
mmm_control set_online db1
mmm_control set_online db2

查看下节点状态:
[root@localhost etc]# mmm_control show
Config file: mmm_mon.conf
Daemon is running!
Servers status:
db1(192.168.1.225): master/ONLINE. Roles: reader(192.168.1.230;), writer(192.168.1.231;)
db2(192.168.1.226): master/ONLINE. Roles: reader(192.168.1.229;)

OK,能看到这个效果说明你已经配置成功了,下面就可以随心所欲的折腾mysql的异常状态,来进行测试。

jdbc连接数据库

 JDBC连接数据库经验技巧集萃(1) 
Java数据库连接(JDBC)由一组用 Java 编程语言编写的类和接口组成。JDBC 为工具/数据库开发人员提供了一个标准的 API,使他们能够用纯Java API 来编写数据库应用程序。然而各个开发商的接口并不完全相同,所以开发环境的变化会带来一定的配置变化。本文主要集合了不同数据库的连接方式。 

  一、连接各种数据库方式速查表 

  下面罗列了各种数据库使用JDBC连接的方式,可以作为一个手册使用。 

  1、Oracle8/8i/9i数据库(thin模式) 



Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); 
String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl为数据库的SID 
String user="test"; 
String password="test"; 
Connection conn= DriverManager.getConnection(url,user,password);  

  2、DB2数据库 

Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance(); 
String url="jdbc:db2://localhost:5000/sample"; //sample为你的数据库名 
String user="admin"; 
String password=""; 
Connection conn= DriverManager.getConnection(url,user,password);  

  3、Sql Server7.0/2000数据库 

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); 
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb"; 
//mydb为数据库 
String user="sa"; 
String password=""; 
Connection conn= DriverManager.getConnection(url,user,password);  

  4、Sybase数据库 

Class.forName("com.sybase.jdbc.SybDriver").newInstance(); 
String url =" jdbc:sybase:Tds:localhost:5007/myDB";//myDB为你的数据库名 
Properties sysProps = System.getProperties(); 
SysProps.put("user","userid"); 
SysProps.put("password","user_password"); 
Connection conn= DriverManager.getConnection(url, SysProps);  

  5、Informix数据库 

Class.forName("com.informix.jdbc.IfxDriver").newInstance(); 
String url = "jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver; 
user=testuser;password=testpassword"; //myDB为数据库名 
Connection conn= DriverManager.getConnection(url);  

  6、MySQL数据库 

Class.forName("org.gjt.mm.mysql.Driver").newInstance(); 
String url ="jdbc:mysql://localhost/myDB user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1" 
//myDB为数据库名 
Connection conn= DriverManager.getConnection(url);  

  7、PostgreSQL数据库 

Class.forName("org.postgresql.Driver").newInstance(); 
String url ="jdbc:postgresql://localhost/myDB" //myDB为数据库名 
String user="myuser"; 
String password="mypassword"; 
Connection conn= DriverManager.getConnection(url,user,password);  

  8、access数据库直连用ODBC的 

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ; 
String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb"); 
Connection conn = DriverManager.getConnection(url,"",""); 
Statement stmtNew=conn.createStatement() ;  

  二、JDBC连接MySql方式 

  下面是使用JDBC连接MySql的一个小的教程 

  1、查找驱动程序 

  MySQL目前提供的java驱动程序为Connection/J,可以从MySQL官方网站下载,并找到mysql-connector-java-3.0.15-ga-bin.jar文件,此驱动程序为纯java驱动程序,不需做其他配置。 

  2、动态指定classpath 

  如果需要执行时动态指定classpath,就在执行时采用-cp方式。否则将上面的.jar文件加入到classpath环境变量中。 

  3、加载驱动程序 

try{ 
 Class.forName(com.mysql.jdbc.Driver); 
 System.out.println(Success loading Mysql Driver!); 
}catch(Exception e) 
{ 
 System.out.println(Error loading Mysql Driver!); 
 e.printStackTrace(); 
}  

  4、设置连接的url 

jdbc:mysql://localhost/databasename[ pa=va][&pa=va]  

  

Jdbc连接各种数据库代码方法大全

1、Oracle8/8i/9i数据库(thin模式)

Class.forName(“oracle.jdbc.driver.OracleDriver”).newInstance();

String url=”jdbc:oracle:thin:@localhost:1521:orcl”;

//orcl为数据库的SID

String user=”test”;

String password=”test”;

Connection conn= DriverManager.getConnection(url,user,password);

2、DB2数据库

Class.forName(“com.ibm.db2.jdbc.app.DB2Driver “).newInstance();

String url=”jdbc:db2://localhost:5000/sample”;

//sample为你的数据库名

String user=”admin”;

String password=””;

Connection conn= DriverManager.getConnection(url,user,password);

3、Sql Server7.0/2000数据库

Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”).newInstance();

String url=”jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb”;

//mydb为数据库

String user=”sa”;

String password=””;

Connection conn= DriverManager.getConnection(url,user,password);

4、Sybase数据库

Class.forName(“com.sybase.jdbc.SybDriver”).newInstance();

String url =” jdbc:sybase:Tds:localhost:5007/myDB”;

//myDB为你的数据库名

Properties sysProps = System.getProperties();

SysProps.put(“user”,”userid”);

SysProps.put(“password”,”user_password”);

Connection conn= DriverManager.getConnection(url, SysProps);

5、Informix数据库

Class.forName(“com.informix.jdbc.IfxDriver”).newInstance();

String url =

“jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;

user=testuser;password=testpassword”;

//myDB为数据库名

Connection conn= DriverManager.getConnection(url);

6、MySQL数据库

Class.forName(“org.gjt.mm.mysql.Driver”).newInstance();

String url =”jdbc:mysql://localhost/myDB user=soft&password=soft1234&useUnicod

e=true&characterEncoding=8859_1″

//myDB为数据库名

Connection conn= DriverManager.getConnection(url);

7、PostgreSQL数据库

Class.forName(“org.postgresql.Driver”).newInstance();

String url =”jdbc:postgresql://localhost/myDB”

//myDB为数据库名

String user=”myuser”;

String password=”mypassword”;

Connection conn= DriverManager.getConnection(url,user,password);

mysql调优

http://hi.baidu.com/xuwanbest/blog/item/193fd93dda509303bba167e3.html

关于 MySQL 调优

有 3 种方法可以加快 MySQL 服务器的运行速度,效率从低到高依次为:

  1. 替换有问题的硬件。
  2. 对 MySQL 进程的设置进行调优。
  3. 对查询进行优化。
迁移到 DB2
您正在寻找一种干净利落、无成本的方法用来从 MySQL 迁移到 IBM  DB2  吗?“从 MySQL 或 PostgreSQL 迁移到 DB2 Express-C” 介绍了如何使用文中提供的迁移工具来简单地实现这种转换。可以 下载 免费的 DB2 Express-C 并开始体验。

替换有问题的硬件通常是我们的第一考虑,主要原因是数据库会占用大量资源。不过这种解决方案也就仅限于此了。实际上,您通常可以让中央处理器(CPU)或磁盘速度加倍,也可以让内存增大 4 到 8 倍。

第二种方法是对 MySQL 服务器(也称为 mysqld)进行调优。对这个进程进行调优意味着适当地分配内存,并让 mysqld 了解将会承受何种类型的负载。加快磁盘运行速度不如减少所需的磁盘访问次数。类似地,确保 MySQL 进程正确操作就意味着它花费在服务查询上的时间要多于花费在处理后台任务(如处理临时磁盘表或打开和关闭文件)上的时间。对 mysqld 进行调优是本文的重点。

最好的方法是确保查询已经进行了优化。这意味着对表应用了适当的索引,查询是按照可以充分利用 MySQL 功能的方式来编写的。尽管本文并没有包含查询调优方面的内容(很多著作中已经针对这个主题进行了探讨),不过它会配置 mysqld 来报告可能需要进行调优的查询。

虽然已经为这些任务指派了次序,但是仍然要注意硬件和 mysqld 的设置以利于适当地调优查询。机器速度慢也就罢了,我曾经见过速度很快的机器在运行设计良好的查询时由于负载过重而失败,因为 mysqld 被大量繁忙的工作所占用而不能服务查询。

 


回页首

记录慢速查询

在一个 SQL 服务器中,数据表都是保存在磁盘上的。索引为服务器提供了一种在表中查找特定数据行的方法,而不用搜索整个表。当必须要搜索整个表时,就称为表扫描。通常来说,您可能只希望获得表中数据的一个子集,因此全表扫描会浪费大量的磁盘 I/O,因此也就会浪费大量时间。当必须对数据进行连接时,这个问题就更加复杂了,因为必须要对连接两端的多行数据进行比较。

当 然,表扫描并不总是会带来问题;有时读取整个表反而会比从中挑选出一部分数据更加有效(服务器进程中查询规划器用来作出这些决定)。如果索引的使用效率很 低,或者根本就不能使用索引,则会减慢查询速度,而且随着服务器上的负载和表大小的增加,这个问题会变得更加显著。执行时间超过给定时间范围的查询就称为慢速查询

您可以配置 mysqld 将这些慢速查询记录到适当命名的慢速查询日志中。管理员然后会查看这个日志来帮助他们确定应用程序中有哪些部分需要进一步调查。清单 1 给出了要启用慢速查询日志需要在 my.cnf 中所做的配置。

清单 1. 启用 MySQL 慢速查询日志

                
[mysqld]
; enable the slow query log, default 10 seconds
log-slow-queries
; log queries taking longer than 5 seconds
long_query_time = 5
; log queries that don't use indexes even if they take less than long_query_time
; MySQL 4.1 and newer only
log-queries-not-using-indexes

 

这三个设置一起使用,可以记录执行时间超过 5 秒和没有使用索引的查询。请注意有关 log-queries-not-using-indexes 的警告:您必须使用 MySQL 4.1 或更高版本。慢速查询日志都保存在 MySQL 数据目录中,名为 hostname-slow.log。如果希望使用一个不同的名字或路径,可以在 my.cnf 中使用 log-slow-queries = /new/path/to/file 实现此目的。

阅读慢速查询日志最好是通过 mysqldumpslow 命令进行。指定日志文件的路径,就可以看到一个慢速查询的排序后的列表,并且还显示了它们在日志文件中出现的次数。一个非常有用的特性是 mysqldumpslow 在比较结果之前,会删除任何用户指定的数据,因此对同一个查询的不同调用被计为一次;这可以帮助找出需要工作量最多的查询。

 


回页首

对查询进行缓存

很多 LAMP 应用程序都严重依赖于数据库,但却会反复执行相同的查询。每次执行查询时,数据库都必须要执行相同的工作 —— 对查询进行分析,确定如何执行查询,从磁盘中加载信息,然后将结果返回给客户机。MySQL 有一个特性称为查询缓存,它将(后面会用到的)查询结果保存在内存中。在很多情况下,这会极大地提高性能。不过,问题是查询缓存在默认情况下是禁用的。

query_cache_size = 32M 添加到 /etc/my.conf 中可以启用 32MB 的查询缓存。

监视查询缓存

在启用查询缓存之后,重要的是要理解它是否得到了有效的使用。MySQL 有几个可以查看的变量,可以用来了解缓存中的情况。清单 2 给出了缓存的状态。

清单 2. 显示查询缓存的统计信息

                
mysql> SHOW STATUS LIKE 'qcache%';
+-------------------------+------------+
| Variable_name           | Value      |
+-------------------------+------------+
| Qcache_free_blocks      | 5216       |
| Qcache_free_memory      | 14640664   |
| Qcache_hits             | 2581646882 |
| Qcache_inserts          | 360210964  |
| Qcache_lowmem_prunes    | 281680433  |
| Qcache_not_cached       | 79740667   |
| Qcache_queries_in_cache | 16927      |
| Qcache_total_blocks     | 47042      |
+-------------------------+------------+
8 rows in set (0.00 sec)

 

这些项的解释如表 1 所示。

表 1. MySQL 查询缓存变量

变量名说明
Qcache_free_blocks 缓存中相邻内存块的个数。数目大说明可能有碎片。FLUSH QUERY CACHE 会对缓存中的碎片进行整理,从而得到一个空闲块。
Qcache_free_memory 缓存中的空闲内存。
Qcache_hits 每次查询在缓存中命中时就增大。
Qcache_inserts 每次插入一个查询时就增大。命中次数除以插入次数就是不中比率;用 1 减去这个值就是命中率。在上面这个例子中,大约有 87% 的查询都在缓存中命中。
Qcache_lowmem_prunes 缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的 free_blocksfree_memory 可以告诉您属于哪种情况)。
Qcache_not_cached 不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句。
Qcache_queries_in_cache 当前缓存的查询(和响应)的数量。
Qcache_total_blocks 缓存中块的数量。

通常,间隔几秒显示这些变量就可以看出区别,这可以帮助确定缓存是否正在有效地使用。运行 FLUSH STATUS 可以重置一些计数器,如果服务器已经运行了一段时间,这会非常有帮助。

使用非常大的查询缓存,期望可以缓存所有东西,这种想法非常诱人。由于 mysqld 必须要对缓存进行维护,例如当内存变得很低时执行剪除,因此服务器可能会在试图管理缓存时而陷入困境。作为一条规则,如果 FLUSH QUERY CACHE 占用了很长时间,那就说明缓存太大了。

 


回页首

强制限制

您可以在 mysqld 中强制一些限制来确保系统负载不会导致资源耗尽的情况出现。清单 3 给出了 my.cnf 中与资源有关的一些重要设置。

清单 3. MySQL 资源设置

                
set-variable=max_connections=500
set-variable=wait_timeout=10
max_connect_errors = 100

 

连接最大个数是在第一行中进行管理的。与 Apache 中的 MaxClients 类似,其想法是确保只建立服务允许数目的连接。要确定服务器上目前建立过的最大连接数,请执行 SHOW STATUS LIKE 'max_used_connections'

第 2 行告诉 mysqld 终止所有空闲时间超过 10 秒的连接。在 LAMP 应用程序中,连接数据库的时间通常就是 Web 服务器处理请求所花费的时间。有时候,如果负载过重,连接会挂起,并且会占用连接表空间。如果有多个交互用户或使用了到数据库的持久连接,那么将这个值设 低一点并不可取!

最后一行是一个安全的方法。如果一个主机在连接到服务器时有问题,并重试很多次后放弃,那么这个主机就会被锁定,直到 FLUSH HOSTS 之后才能运行。默认情况下,10 次失败就足以导致锁定了。将这个值修改为 100 会给服务器足够的时间来从问题中恢复。如果重试 100 次都无法建立连接,那么使用再高的值也不会有太多帮助,可能它根本就无法连接。

 


回页首

缓冲区和缓存

MySQL 支持超过 100 个的可调节设置;但是幸运的是,掌握少数几个就可以满足大部分需要。查找这些设置的正确值可以通过 SHOW STATUS 命令查看状态变量,从中可以确定 mysqld 的运作情况是否符合我们的预期。给缓冲区和缓存分配的内存不能超过系统中的现有内存,因此调优通常都需要进行一些妥协。

MySQL 可调节设置可以应用于整个 mysqld 进程,也可以应用于单个客户机会话。

服务器端的设置

每个表都可以表示为磁盘上的一个文件,必须先打开,后读取。为了加快从文件中读取数据的过程,mysqld 对这些打开文件进行了缓存,其最大数目由 /etc/mysqld.conf 中的 table_cache 指定。清单 4 给出了显示与打开表有关的活动的方式。

清单 4. 显示打开表的活动

                
mysql> SHOW STATUS LIKE 'open%tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables   | 5000  |
| Opened_tables | 195   |
+---------------+-------+
2 rows in set (0.00 sec)

 

清单 4 说明目前有 5,000 个表是打开的,有 195 个表需要打开,因为现在缓存中已经没有可用文件描述符了(由于统计信息在前面已经清除了,因此可能会存在 5,000 个打开表中只有 195 个打开记录的情况)。如果 Opened_tables 随着重新运行 SHOW STATUS 命令快速增加,就说明缓存命中率不够。如果 Open_tablestable_cache 设置小很多,就说明该值太大了(不过有空间可以增长总不是什么坏事)。例如,使用 table_cache = 5000 可以调整表的缓存。

与表的缓存类似,对于线程来说也有一个缓存。 mysqld 在接收连接时会根据需要生成线程。在一个连接变化很快的繁忙服务器上,对线程进行缓存便于以后使用可以加快最初的连接。

清单 5 显示如何确定是否缓存了足够的线程。

清单 5. 显示线程使用统计信息

                
mysql> SHOW STATUS LIKE 'threads%';
+-------------------+--------+
| Variable_name     | Value  |
+-------------------+--------+
| Threads_cached    | 27     |
| Threads_connected | 15     |
| Threads_created   | 838610 |
| Threads_running   | 3      |
+-------------------+--------+
4 rows in set (0.00 sec)

 

此处重要的值是 Threads_created,每次 mysqld 需要创建一个新线程时,这个值都会增加。如果这个数字在连续执行 SHOW STATUS 命令时快速增加,就应该尝试增大线程缓存。例如,可以在 my.cnf 中使用 thread_cache = 40 来实现此目的。

关键字缓冲区保存了 MyISAM 表的索引块。理想情况下,对于这些块的请求应该来自于内存,而不是来自于磁盘。清单 6 显示了如何确定有多少块是从磁盘中读取的,以及有多少块是从内存中读取的。

清单 6. 确定关键字效率

                
mysql> show status like '%key_read%';
+-------------------+-----------+
| Variable_name     | Value     |
+-------------------+-----------+
| Key_read_requests | 163554268 |
| Key_reads         | 98247     |
+-------------------+-----------+
2 rows in set (0.00 sec)

 

Key_reads 代表命中磁盘的请求个数, Key_read_requests 是总数。命中磁盘的读请求数除以读请求总数就是不中比率 —— 在本例中每 1,000 个请求,大约有 0.6 个没有命中内存。如果每 1,000 个请求中命中磁盘的数目超过 1 个,就应该考虑增大关键字缓冲区了。例如,key_buffer = 384M 会将缓冲区设置为 384MB。

临时表可以在更高级的查询中使用,其中数据在进一步进行处理(例如 GROUP BY 字句)之前,都必须先保存到临时表中;理想情况下,在内存中创建临时表。但是如果临时表变得太大,就需要写入磁盘中。清单 7 给出了与临时表创建有关的统计信息。

清单 7. 确定临时表的使用

                
mysql> SHOW STATUS LIKE 'created_tmp%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 30660 |
| Created_tmp_files       | 2     |
| Created_tmp_tables      | 32912 |
+-------------------------+-------+
3 rows in set (0.00 sec)

 

每次使用临时表都会增大 Created_tmp_tables;基于磁盘的表也会增大 Created_tmp_disk_tables。对于这个比率,并没有什么严格的规则,因为这依赖于所涉及的查询。长时间观察 Created_tmp_disk_tables 会显示所创建的磁盘表的比率,您可以确定设置的效率。 tmp_table_sizemax_heap_table_size 都可以控制临时表的最大大小,因此请确保在 my.cnf 中对这两个值都进行了设置。

每个会话的设置

下面这些设置针对于每个会话。在设置这些数字时要十分谨慎,因为它们在乘以可能存在的连接数时候,这些选项表示大量的内存!您可以通过代码修改会话中的这些数字,或者在 my.cnf 中为所有会话修改这些设置。

当 MySQL 必须要进行排序时,就会在从磁盘上读取数据时分配一个排序缓冲区来存放这些数据行。如果要排序的数据太大,那么数据就必须保存到磁盘上的临时文件中,并再次进行排序。如果 sort_merge_passes 状态变量很大,这就指示了磁盘的活动情况。清单 8 给出了一些与排序相关的状态计数器信息。

清单 8. 显示排序统计信息

                
mysql> SHOW STATUS LIKE "sort%";
+-------------------+---------+
| Variable_name     | Value   |
+-------------------+---------+
| Sort_merge_passes | 1       |
| Sort_range        | 79192   |
| Sort_rows         | 2066532 |
| Sort_scan         | 44006   |
+-------------------+---------+
4 rows in set (0.00 sec)

 

如果 sort_merge_passes 很大,就表示需要注意 sort_buffer_size。例如, sort_buffer_size = 4M 将排序缓冲区设置为 4MB。

MySQL 也会分配一些内存来读取表。理想情况下,索引提供了足够多的信息,可以只读入所需要的行,但是有时候查询(设计不佳或数据本性使然)需要读取表中大量数据。要理解这种行为,需要知道运行了多少个 SELECT 语句,以及需要读取表中的下一行数据的次数(而不是通过索引直接访问)。实现这种功能的命令如清单 9 所示。

清单 9. 确定表扫描比率

                
mysql> SHOW STATUS LIKE "com_select";
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| Com_select    | 318243 |
+---------------+--------+
1 row in set (0.00 sec)

mysql> SHOW STATUS LIKE "handler_read_rnd_next";
+-----------------------+-----------+
| Variable_name         | Value     |
+-----------------------+-----------+
| Handler_read_rnd_next | 165959471 |
+-----------------------+-----------+
1 row in set (0.00 sec)

 

Handler_read_rnd_next / Com_select 得出了表扫描比率 —— 在本例中是 521:1。如果该值超过 4000,就应该查看 read_buffer_size,例如 read_buffer_size = 4M。如果这个数字超过了 8M,就应该与开发人员讨论一下对这些查询进行调优了!

 


回页首

3 个必不可少的工具

尽管在了解具体设置时,SHOW STATUS 命令会非常有用,但是您还需要一些工具来解释 mysqld 所提供的大量数据。我发现有 3 个工具是必不可少的;在 参考资料 一节中您可以找到相应的链接。

大部分系统管理员都非常熟悉 top 命令,它为任务所消耗的 CPU 和内存提供了一个不断更新的视图。 mytoptop 进行了仿真;它为所有连接上的客户机以及它们正在运行的查询提供了一个视图。mytop 还提供了一个有关关键字缓冲区和查询缓存效率的实时数据和历史数据,以及有关正在运行的查询的统计信息。这是一个很有用的工具,可以查看系统中(比如 10 秒钟之内)的状况,您可以获得有关服务器健康信息的视图,并显示导致问题的任何连接。

mysqlard 是一个连接到 MySQL 服务器上的守护程序,负责每 5 分钟搜集一次数据,并将它们存储到后台的一个 Round Robin Database 中。有一个 Web 页面会显示这些数据,例如表缓存的使用情况、关键字效率、连接上的客户机以及临时表的使用情况。尽管 mytop 提供了服务器健康信息的快照,但是 mysqlard 则提供了长期的健康信息。作为奖励,mysqlard 使用自己搜集到的一些信息针对如何对服务器进行调优给出一些建议。

搜集 SHOW STATUS 信息的另外一个工具是 mysqlreport。其报告要远比 mysqlard 更加复杂,因为需要对服务器的每个方面都进行分析。这是对服务器进行调优的一个非常好的工具,因为它对状态变量进行适当计算来帮助确定需要修正哪些问题。

JDBC连接各种数据库方法

1、Oracle8/8i/9i数据库(thin模式)

    Class.forName(“oracle.jdbc.driver.OracleDriver”).newInstance();
    String url=”jdbc:oracle:thin:@localhost:1521:orcl”;
    //orcl为数据库的SID
    String user=”test”;
    String password=”test”;
    Connection conn= DriverManager.getConnection(url,user,password);

    2、DB2数据库

    Class.forName(“com.ibm.db2.jdbc.app.DB2Driver “).newInstance();
    String url=”jdbc:db2://localhost:5000/sample”;
    //sample为你的数据库名
    String user=”admin”;
    String password=””;
    Connection conn= DriverManager.getConnection(url,user,password);

    3、Sql Server7.0/2000数据库

    Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”).newInstance();
    String url=”jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb”;
    //mydb为数据库
    String user=”sa”;
    String password=””;
    Connection conn= DriverManager.getConnection(url,user,password);

    4、Sybase数据库

    Class.forName(“com.sybase.jdbc.SybDriver”).newInstance();
    String url =” jdbc:sybase:Tds:localhost:5007/myDB”;
    //myDB为你的数据库名
    Properties sysProps = System.getProperties();
    SysProps.put(“user”,”userid”);
    SysProps.put(“password”,”user_password”);
    Connection conn= DriverManager.getConnection(url, SysProps);

    5、Informix数据库

    Class.forName(“com.informix.jdbc.IfxDriver”).newInstance();
    String url =
    “jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;
    user=testuser;password=testpassword”;
    //myDB为数据库名
    Connection conn= DriverManager.getConnection(url);

    6、MySQL数据库

    Class.forName(“org.gjt.mm.mysql.Driver”).newInstance();
    String url =”jdbc:mysql://localhost/myDB user=soft&password=soft1234&useUnicod
    e=true&characterEncoding=8859_1″
    //myDB为数据库名
    Connection conn= DriverManager.getConnection(url);

    7、PostgreSQL数据库

    Class.forName(“org.postgresql.Driver”).newInstance();
    String url =”jdbc:postgresql://localhost/myDB”
    //myDB为数据库名
    String user=”myuser”;
    String password=”mypassword”;
    Connection conn= DriverManager.getConnection(url,user,password);

 

Hibernate3.0英文教程

http://www.roseindia.net/hibernate/index.shtml

 

来由是朝着generator:

 

Here are the list of some commonly used generators in
hibernate:

Generator Description
increment It generates identifiers of type long, short or int that
are unique only when no other process is inserting data into the same
table. It should not the used in the clustered environment.
identity It supports identity columns in DB2, MySQL, MS SQL Server,
Sybase and HypersonicSQL. The returned identifier is of type long, short
or int.
sequence The sequence generator uses a sequence in DB2, PostgreSQL,
Oracle, SAP DB, McKoi or a generator in Interbase. The returned
identifier is of type long, short or int
hilo The hilo generator uses a hi/lo algorithm to efficiently
generate identifiers of type long, short or int, given a table and
column (by default hibernate_unique_key and next_hi respectively) as a
source of hi values. The hi/lo algorithm generates identifiers that are
unique only for a particular database. Do not use this generator with
connections enlisted with JTA or with a user-supplied connection.
seqhilo The seqhilo generator uses a hi/lo algorithm to
efficiently generate identifiers of type long, short or int, given a
named database sequence.
uuid The uuid generator uses a 128-bit UUID algorithm to
generate identifiers of type string, unique within a network (the IP
address is used). The UUID is encoded as a string of hexadecimal digits
of length 32.
guid It uses a database-generated GUID string on MS SQL Server
and MySQL.
native It picks identity, sequence or hilo depending upon the
capabilities of the underlying database.
assigned lets the application to assign an identifier to the object
before save() is called. This is the default strategy if no
<generator> element is specified.
select retrieves a primary key assigned by a database trigger by
selecting the row by some unique key and retrieving the primary key
value.
foreign uses the identifier of another associated object. Usually
used in conjunction with a <one-to-one> primary key association.