MYSQL源码分析(二)--主要代码流程

MYSQL源码分析(二)--主要代码流程
MYSQL源码分析(二)--主要代码流程

我们从MySQL启动开始,看一下MySQL业务流程。

★首先入口函数在目录sql/https://www.360docs.net/doc/6216354355.html,中:

int main(int argc, char **argv)

{

return mysqld_main(argc, argv);

}

调用了mysqld_main(argc, argv)函数,这个函数在sql/https://www.360docs.net/doc/6216354355.html,中

接着开始初始化:

★MY_INIT(argv[0]); 函数位于sql/my_https://www.360docs.net/doc/6216354355.html,,用于初始化mysql内部的系统库,MYSQL定义了大量的全局变量用于系统的状态值,这样省去很多函数之间的交互参数,这些全局变量定义在my_https://www.360docs.net/doc/6216354355.html,中。

★接着初始化变量sys_var_init();

★初始化审计接口(这部分用的不多,暂时不深入)mysql_audit_initialize();

★初始化日志功能logger.init_base();日志是系统的一个重要地方,mysql定义了一个logger 类,在文件sql/Logger.hpp中,里面定义了一系列的成员函数,具体可以参照logger.hpp 中的注释,很详细。(后续会专门针对日志模块做一次分析)

★接着就初始化配置信息了,

开始之后,又是一大堆全局变量初始化。

init_thread_environment()初始化线程环境。(这个就是线程池了)

mysql_init_variables()初始化配置变量,

这边给我最大的感悟就是,MYSQL在获取或者修改一些变量时,一定会先与之相关的系统变量都读出来确认一遍,全部没问题后才修改,有问题都会有相应的日志(所以日志模块必须最先初始化)

如果初始化失败,会调用mysql_server_end() ,而mysql_server_end()实际上是一个宏定义

#define mysql_server_end() mysql_client_plugin_deinit()宏定义也可以这样用

mysql_client_plugin_deinit()用于终止mysql server的线程。

★初始化server的模块init_server_components()

table_def_init() || hostname_cache_init(),初始化table cache

query_cache_init();初始化查询cache

#ifdef HAVE_REPLICATION

init_slave_list();如果有复制,还要初始化备机的状态list

#endif

后面还有一些cache初始化如

★network_init();//初始化网络模块,创建socket监听

这个流程和传统的tcp服务端代码基本一样,单独开启一个线程用于监听,set_ports();

函数用于初始化端口,默认为3306。

ip_sock= create_socket(ai, AF_INET, &a);

if (ip_sock == INVALID_SOCKET)

ip_sock= create_socket(ai, AF_INET6, &a);

// Report user-error if we failed to create a socket.

if (ip_sock == INVALID_SOCKET)

{

sql_perror(ER_DEFAULT(ER_IPSOCK_ERROR)); /* purecov: tested */

unireg_abort(1); /* purecov: tested */ }

现在IPV4上创建侦听,如果失败了,再在ipv6上创建侦听。

有时候,mysql所用的端口不会及时释放(重启,关闭的时候),这里有个算法for (waited= 0, retry= 1; ; retry++, waited+= this_wait)

{

if (((ret= bind(ip_sock, a->ai_addr, a->ai_addrlen)) >= 0 ) ||

(socket_errno != SOCKET_EADDRINUSE) ||

(waited >= mysqld_port_timeout))

break;

sql_print_information("Retrying bind on TCP/IP port %u", mysqld_port);

this_wait= retry * retry / 3 + 1;

sleep(this_wait);

}

他会按照

Sleep intervals: 1, 2, 4, 6, 9, 13, 17, 22, ...

Retry at second: 1, 3, 7, 13, 22, 35, 52, 74, ...

来省资源。

接着就是三种系统的侦听代码,原理都是一样的。

★start_signal_handler();// 创建pid文件

调用create_pid_file(),调用了自己封装的mysql_file_write()把内容写到了文件,mysql_file_write()也是个宏定义。

★if (mysql_rm_tmp_tables() || acl_init(opt_noacl) ||

my_tz_init((THD *)0, default_tz_name, opt_bootstrap))

删除tmp_table并初始化数据库级别的权限。

★init_status_vars(); 初始化mysql中的status变量

inlog_unsafe_map_init();

initialize_information_schema_acl();

execute_ddl_log_recovery();

create_shutdown_thread();

未启动先保护,这样异常出现时,系统不会直接崩掉,同时会尽可能的多保留下信息。

★start_handle_manager(); 创建manager线程

mysql_thread_create(key_thread_handle_manager,

&hThread, &connection_attrib, handle_manager, 0)

★handle_connections_sockets();

主要处理函数,

一系列异常保护之后,如果系统收到新的连接,就创建新的线程处理之

create_new_thread(thd);

这里可以看出在创建线程之前,有大部分的代码用来检查内容是否有问题,大约占了2/3,所以异常保护,入参校验是很重要的。

★对当前连接数检测connection_count,先对互斥量LOCK_connection_count枷锁,如果大于max_connections+1,则报错,没有问题,才新建线程,(一个典型的互斥线程),ok,现在线程创建成功了。

之后的一段代码一度让我很费解。前前后后看了很久,终于搞明白流程是怎么继续往下面走的。以下是整个过程:

★在create_new_thread(thd);的末尾,有一行代码:

MYSQL_CALLBACK(thread_scheduler, add_connection, (thd));同样他是一个宏:#define MYSQL_CALLBACK(OBJ, FUNC, PARAMS) \

do { \

if ((OBJ) && ((OBJ)->FUNC)) \

(OBJ)->FUNC PARAMS; \

} while (0)

这样,这个代码就是调用thread_scheduler的add_connection函数,参数是(thd)。

★继续看的定义:(代码在https://www.360docs.net/doc/6216354355.html,里面)

scheduler_functions *thread_scheduler= NULL;

scheduler_functions的定义:

struct scheduler_functions

{

uint max_threads;

bool (*init)(void);

bool (*init_new_connection_thread)(void);

void (*add_connection)(THD *thd);

void (*thd_wait_begin)(THD *thd, int wait_type);

void (*thd_wait_end)(THD *thd);

void (*post_kill_notification)(THD *thd);

bool (*end_thread)(THD *thd, bool cache_thread);

void (*end)(void);

};

可以看得出来,add_connection是他这个结构的第四个成员,是一个成员变量。

★Mysql给thread_scheduler提供了两种值,一种单线程的情况,一种是多线程的情况。

单线程就是每次只有一个用户连接,多线程用的比较多。

单线程:

static scheduler_functions one_thread_scheduler_functions=

{

1, // max_threads

NULL, // init

init_new_connection_handler_thread, // init_new_connection_thread

#ifndef EMBEDDED_LIBRARY

handle_connection_in_main_thread, // add_connection

#else

NULL, // add_connection

#endif // EMBEDDED_LIBRARY

NULL, // thd_wait_begin

NULL, // thd_wait_end

NULL, // post_kill_notification

no_threads_end, // end_thread

NULL, // end

};

多线程:

#ifndef EMBEDDED_LIBRARY

static scheduler_functions one_thread_per_connection_scheduler_functions=

{

0, // max_threads

NULL, // init

init_new_connection_handler_thread, // init_new_connection_thread

create_thread_to_handle_connection, // add_connection

NULL, // thd_wait_begin

NULL, // thd_wait_end

NULL, // post_kill_notification

one_thread_per_connection_end, // end_thread

NULL, // end

};

#endif // EMBEDDED_LIBRARY

EMBEDDED_LIBRARY是一种用于开发板的库。

★那么MYSQL是怎么知道当前thread_scheduler的值呢,这个就是我忽视的问题。在上文所述,logger.init()之后,mysql调用了一个init_common_variables()函数,里面初始化了这个变量的值。

在init_common_variables()中调用了一个get_options()函数:

#ifdef EMBEDDED_LIBRARY

one_thread_scheduler();

#else

if (thread_handling <= SCHEDULER_ONE_THREAD_PER_CONNECTION)

one_thread_per_connection_scheduler();

else /* thread_handling == SCHEDULER_NO_THREADS) */

one_thread_scheduler();

#endif

我们这边多线程用的比较多,所以从上述的函数,参照多线程的结构体,上述回调函数就是调用了create_thread_to_handle_connection这个函数。

找到这个函数(在https://www.360docs.net/doc/6216354355.html,里),流程继续:

★在create_thread_to_handle_connection中:

if ((error= mysql_thread_create(key_thread_one_connection,

&thd->real_id, &connection_attrib,

handle_one_connection,

(void*) thd)))

{

创建一个线程,并调用handle_one_connection函数

★在handle_one_connection中继续调用do_handle_one_connection()

★之后又是一个回调函数:

MYSQL_CALLBACK_ELSE(thread_scheduler, init_new_connection_thread, (), 0)

★找到init_new_connection_thread(),里面调用了my_thread_init()到目前为止,才算创建了一个新的线程

★在进行一些确认过程后,终于来到了do_command(thd)

★在接收到command的时候,mysql对command做了一些简单的处理(后来我才知道,这个叫做预处理。。。),就开始分发dispatch_command()

★在dispatch_command()中,有一个巨大的switch语句,里面涵盖了MYSQL支持的所有语句,这些语句在mysql_com.h中定义

enum enum_server_command

{

COM_SLEEP, COM_QUIT, COM_INIT_DB, COM_QUERY, COM_FIELD_LIST,

COM_CREATE_DB, COM_DROP_DB, COM_REFRESH, COM_SHUTDOWN, COM_STATISTICS,

COM_PROCESS_INFO, COM_CONNECT, COM_PROCESS_KILL, COM_DEBUG, COM_PING,

COM_TIME, COM_DELAYED_INSERT, COM_CHANGE_USER, COM_BINLOG_DUMP,

COM_TABLE_DUMP, COM_CONNECT_OUT, COM_REGISTER_SLAVE,

COM_STMT_PREPARE, COM_STMT_EXECUTE, COM_STMT_SEND_LONG_DATA, COM_STMT_CLOSE,

COM_STMT_RESET, COM_SET_OPTION, COM_STMT_FETCH, COM_DAEMON,

/* don't forget to update const char *command_name[] in sql_https://www.360docs.net/doc/6216354355.html, */

/* Must be last */

COM_END

};

★我们以查询语句为例

在收到查询指令后,mysql还是先预处理,然后在处理:

mysql_parse(thd, thd->query(), thd->query_length(), &end_of_stmt);

解析查询语句

★在mysql_parse函数中,有段注释:

/*

Warning.

The purpose of query_cache_send_result_to_client() is to lookup the

query in the query cache first, to avoid parsing and executing it.

So, the natural implementation would be to:

- first, call query_cache_send_result_to_client,

- second, if caching failed, initialise the lexical and syntactic parser.

The problem is that the query cache depends on a clean initialization

of (among others) lex->safe_to_cache_query and thd->server_status,

which are reset respectively in

- lex_start()

- mysql_reset_thd_for_next_command()

So, initializing the lexical analyser *before* using the query cache

is required for the cache to work properly.

FIXME: cleanup the dependencies in the code to simplify this.

*/

他大概的意思是:本来mysql应该先调用query_cache_send_result_to_client()在query_cache 中查询该语句,加快查询速度。如果失败,在调用lex_start()和mysql_reset_thd_for_next_command()来初始化thd,在解析sql。但是查询cache也需要干净的thd,只能先调用lex_start()和mysql_reset_thd_for_next_command()来初始化thd了,这样导致代码和逻辑有悖。

★好,作者说的很清楚了,那么我们接下来,就应该先查cache,查询不到,再进行命令解析。

lex_start(thd);

query_cache_send_result_to_client(thd, (char*) inBuf, length) sql_command

mysql_execute_command(thd);

★在mysql_execute_command()中,先确定command要对哪张表操作

lex->first_lists_tables_same();

根据该表的状态,会做一些预处理,尽量减少之后的操作对表的影响(因为目前还不知道这条指令执行之后,会对数据库产生什么样的影响)做好保护是必须的。

★然后有个switch语句,他决定了command属于哪种类型,

这些类型定义在sql_lex.h中:

enum enum_sql_command {

SQLCOM_SELECT, SQLCOM_CREATE_TABLE, SQLCOM_CREATE_INDEX, SQLCOM_ALTER_TABLE,

SQLCOM_UPDATE, SQLCOM_INSERT, SQLCOM_INSERT_SELECT,

SQLCOM_DELETE, SQLCOM_TRUNCATE, SQLCOM_DROP_TABLE, SQLCOM_DROP_INDEX,

SQLCOM_SHOW_DATABASES, SQLCOM_SHOW_TABLES, SQLCOM_SHOW_FIELDS,

SQLCOM_SHOW_KEYS, SQLCOM_SHOW_VARIABLES, SQLCOM_SHOW_STATUS,

SQLCOM_SHOW_ENGINE_LOGS, SQLCOM_SHOW_ENGINE_STATUS, SQLCOM_SHOW_ENGINE_MUTEX,

SQLCOM_SHOW_PROCESSLIST, SQLCOM_SHOW_MASTER_STAT, SQLCOM_SHOW_SLAVE_STAT,

SQLCOM_SHOW_GRANTS, SQLCOM_SHOW_CREATE, SQLCOM_SHOW_CHARSETS,

SQLCOM_SHOW_COLLATIONS, SQLCOM_SHOW_CREATE_DB, SQLCOM_SHOW_TABLE_STATUS,

SQLCOM_SHOW_TRIGGERS,

SQLCOM_LOAD,SQLCOM_SET_OPTION,SQLCOM_LOCK_TABLES,SQLCOM_UNLOCK_TABLES,

SQLCOM_GRANT,

SQLCOM_CHANGE_DB, SQLCOM_CREATE_DB, SQLCOM_DROP_DB, SQLCOM_ALTER_DB,

SQLCOM_REPAIR, SQLCOM_REPLACE, SQLCOM_REPLACE_SELECT,

SQLCOM_CREATE_FUNCTION, SQLCOM_DROP_FUNCTION,

SQLCOM_REVOKE,SQLCOM_OPTIMIZE, SQLCOM_CHECK,

SQLCOM_ASSIGN_TO_KEYCACHE, SQLCOM_PRELOAD_KEYS,

SQLCOM_FLUSH, SQLCOM_KILL, SQLCOM_ANALYZE,

SQLCOM_ROLLBACK, SQLCOM_ROLLBACK_TO_SAVEPOINT,

SQLCOM_COMMIT, SQLCOM_SAVEPOINT, SQLCOM_RELEASE_SAVEPOINT,

SQLCOM_SLAVE_START, SQLCOM_SLAVE_STOP,

SQLCOM_BEGIN, SQLCOM_CHANGE_MASTER,

SQLCOM_RENAME_TABLE,

SQLCOM_RESET, SQLCOM_PURGE, SQLCOM_PURGE_BEFORE, SQLCOM_SHOW_BINLOGS,

SQLCOM_SHOW_OPEN_TABLES,

SQLCOM_HA_OPEN, SQLCOM_HA_CLOSE, SQLCOM_HA_READ,

SQLCOM_SHOW_SLAVE_HOSTS, SQLCOM_DELETE_MULTI, SQLCOM_UPDATE_MULTI, SQLCOM_SHOW_BINLOG_EVENTS, SQLCOM_DO,

SQLCOM_SHOW_WARNS, SQLCOM_EMPTY_QUERY, SQLCOM_SHOW_ERRORS,

SQLCOM_SHOW_STORAGE_ENGINES, SQLCOM_SHOW_PRIVILEGES,

SQLCOM_HELP, SQLCOM_CREATE_USER, SQLCOM_DROP_USER, SQLCOM_RENAME_USER,

SQLCOM_REVOKE_ALL, SQLCOM_CHECKSUM,

SQLCOM_CREATE_PROCEDURE, SQLCOM_CREATE_SPFUNCTION, SQLCOM_CALL,

SQLCOM_DROP_PROCEDURE,

SQLCOM_ALTER_PROCEDURE,SQLCOM_ALTER_FUNCTION,

SQLCOM_SHOW_CREATE_PROC, SQLCOM_SHOW_CREATE_FUNC,

SQLCOM_SHOW_STATUS_PROC, SQLCOM_SHOW_STATUS_FUNC,

SQLCOM_PREPARE, SQLCOM_EXECUTE, SQLCOM_DEALLOCATE_PREPARE,

SQLCOM_CREATE_VIEW, SQLCOM_DROP_VIEW,

SQLCOM_CREATE_TRIGGER, SQLCOM_DROP_TRIGGER,

SQLCOM_XA_START, SQLCOM_XA_END, SQLCOM_XA_PREPARE,

SQLCOM_XA_COMMIT, SQLCOM_XA_ROLLBACK, SQLCOM_XA_RECOVER,

SQLCOM_SHOW_PROC_CODE, SQLCOM_SHOW_FUNC_CODE,

SQLCOM_ALTER_TABLESPACE,

SQLCOM_INSTALL_PLUGIN, SQLCOM_UNINSTALL_PLUGIN,

SQLCOM_SHOW_AUTHORS, SQLCOM_BINLOG_BASE64_EVENT,

SQLCOM_SHOW_PLUGINS,

SQLCOM_SHOW_CONTRIBUTORS,

SQLCOM_CREATE_SERVER, SQLCOM_DROP_SERVER, SQLCOM_ALTER_SERVER,

SQLCOM_CREATE_EVENT, SQLCOM_ALTER_EVENT, SQLCOM_DROP_EVENT,

SQLCOM_SHOW_CREATE_EVENT, SQLCOM_SHOW_EVENTS,

SQLCOM_SHOW_CREATE_TRIGGER,

SQLCOM_ALTER_DB_UPGRADE,

SQLCOM_SHOW_PROFILE, SQLCOM_SHOW_PROFILES,

SQLCOM_SIGNAL, SQLCOM_RESIGNAL,

SQLCOM_SHOW_RELAYLOG_EVENTS,

/*

When a command is added here, be sure it's also added in https://www.360docs.net/doc/6216354355.html,

in "struct show_var_st status_vars[]= {" ...

*/

/* This should be the last !!! */

SQLCOM_END

};

★我们仍然以查询命令为例。找到

case SQLCOM_SELECT:

{

thd->status_https://www.360docs.net/doc/6216354355.html,st_query_cost= 0.0;

/*

lex->exchange != NULL implies SELECT .. INTO OUTFILE and this

requires FILE_ACL access.

*/

ulong privileges_requested= lex->exchange ? SELECT_ACL | FILE_ACL :

SELECT_ACL;

if (all_tables)

res= c heck_table_access(thd,

privileges_requested,

all_tables, FALSE, UINT_MAX, FALSE);

else

res= check_access(thd, privileges_requested, any_db, NULL, NULL, 0, 0);

if (res)

break;

res= execute_sqlcom_select(thd, all_tables);

break;

}

重置查询消耗时间:thd->status_https://www.360docs.net/doc/6216354355.html,st_query_cost= 0.0;

检查用户权限:check_table_access

执行select命令execute_sqlcom_select

之后就是命令的解析,处理,以及然后查询,规整结果集。下次笔记再说。

SQL Server 2008 数据库案例教程课后习题答案

《SQL Server 2008数据库案例教程》练习题及模拟试卷答案 第1章 一、判断题 1. 数据库技术是是计算机数据处理与信息管理系统的核心。(√) 2. 数据是用于描述现实世界中具体事物或抽象概念,可存储的数字符号。(×) 3. 数据库是一个长期存储在计算机内的、有组织的、有共享的、统一管理的数据集合。(√) 4. 数据库管理系统是一个按数据结构来存储和管理数据的服务器管理系统。(×) 5. 关系数据库,是建立在关系模型基础上的数据库。(√) 二、单选题 1. 数据(Data)是一些可存储并具有明确意义的(A) A. 符号 B.图形 C.文字 D.数字 2. 人工阶段计算机用于数值计算,没有操作系统及管理数据的软件。这一阶段的年代是(C) A. 19世纪80年代 B. 20世纪20年代 C.20世纪50年代 D. 20世纪80年代 3. 在网页中常用的图像格式是(D) A..bmp和.jpg B..gif和.bmp C. .png和.bmp D. .gif和.jpg 4.数据库系统的重要特征是什么?(D) A. 数据的独立性和动态性 B.数据的静态性和独立性 C.数据的动态性和共享性 D.数据的独立性和共享性 三、多选题 1.与数据库技术密切相关的基本概念有(ABCD) A. 数据 B. 数据库 C. 数据库管理系统 D. 数据库系统 2.数据库可分为哪几种类型?(ABC) A. 关系型数据库 B. 网状数据库 C. 层次数据库 D.树形数据库 3. DBMS提供数据操作语言DML,为用户提供了哪些操作?(ABCD) A.数据的追加B.数据的删除C.数据的更新D.数据的查询 4.DBMS要分类组织、存储和管理各种数据,包括哪些内容?(ABC) A. 数据字典 B. 用户数据 C. 存取路径 D.服务器 5. 目前,DBMS常见品牌有哪些公司?(ABC) A.微软公司的SQL Server B.IBM公司的DB2 C.甲骨文公司的ORACLE D.索尼公司的MySQL 四、填空题 1.数据库(管理)技术经历了人工管理阶段和文件管理阶段。 2.文件系统不提供对任意部分数据的(快速)访问 3.关系数据库,是建立在关系(模型)基础上的数据库。 4.实体-联系模型(简称E-R模型)是由P.P.Chen于(1976)年首先提出的。

Java中连接MySql数据库的几种方法

JDBC Java中JDBC定义了java与各种sql数据库之间的编程接口,JDBC API是一个统一的标准应用程序编程接口,这样可以屏蔽异种数据库之间的差异。 JDBC的工作原理 JDBC与ODBC(OpenData Base Connectivity,开放式数据库连接)的作用非常类似,它在应用程序和数据库之间起到了桥梁的作用。ODBC使用的特别广泛,在java中还提供了JDBC-ODBC桥,能够在JDBC与ODBC之间进行转换,这样可以通过ODBC屏蔽不同种数据库之间的差异。在JDK的包java.sql.*中定义了一系列的类、接口、异常以及这些类和接口中定义的属性和方法,java的开发人员通过一定的规则调用java.sql.*中的API就可以实现对数据库管理系统的访问。 JDBC的四种驱动 1.JDBC-ODBC Bridge JDBC-ODBC Bridge可以访问一个ODBC数据源,但在执行Java程序的机器上必须安装ODBC驱动,并作出配置,它的调用方式如下图: 因为中间有个JDBC-ODBC,所以影响了执行效率。 配置ODBC数据源的方法如下(以Mysql为例): 第一步,打开控制面板—>管理工具--->数据源(ODBC) 选择系统DSN,这一项默认应该是空的,我这里是已经配置好了一个数据源。

第二步,点击添加 第三步,选择Mysql的ODBC驱动,点击完成。 注:MySQL的ODBC驱动在系统中一般是找不到的,因为它不是系统默认自带的驱动,所以,我们要自己安装我们所需要的MySQL的ODBC驱动。安装步骤如下: ①.下载安装包,https://www.360docs.net/doc/6216354355.html,/downloads/connector/odbc/ ②.我们下载与自己系统相应的ODBC驱动 这里我们选择

用mysql源码进行SQL解析

用mysql源码进行SQL解析 Mysql是通过yacc进行SQL语句解析的,这里介绍一下如何使用mysql的源码进行SQL语句解析。由于Mysql的源代码注释比较少,而且缺少资料,所有些地方研究不够深入。 1Filed介绍 MYSQL中Filed有以下几种类型: enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY, MYSQL_TYPE_SHORT, MYSQL_TYPE_LONG, MYSQL_TYPE_FLOAT, MYSQL_TYPE_DOUBLE, MYSQL_TYPE_NULL, MYSQL_TYPE_TIMESTAMP, MYSQL_TYPE_LONGLONG,MYSQL_TYPE_INT24, MYSQL_TYPE_DATE, MYSQL_TYPE_TIME, MYSQL_TYPE_DATETIME, MYSQL_TYPE_YEAR, MYSQL_TYPE_NEWDATE, MYSQL_TYPE_ENUM=247, MYSQL_TYPE_SET=248, MYSQL_TYPE_TINY_BLOB=249, MYSQL_TYPE_MEDIUM_BLOB=250, MYSQL_TYPE_LONG_BLOB=251, MYSQL_TYPE_BLOB=252, MYSQL_TYPE_VAR_STRING=253, MYSQL_TYPE_STRING=254, MYSQL_TYPE_GEOMETRY=255 }; 下图列出几种常用的Filed子类及其关系 2ITEM介绍 在MYSQL中,有以下ITEM大类型: FIELD_ITEM, FUNC_ITEM, SUM_FUNC_ITEM, STRING_ITEM, INT_ITEM, REAL_ITEM, NULL_ITEM, VARBIN_ITEM, COPY_STR_ITEM, FIELD_AVG_ITEM, DEFAULT_VALUE_ITEM, PROC_ITEM,COND_ITEM, REF_ITEM, FIELD_STD_ITEM, FIELD_VARIANCE_ITEM, INSERT_VALUE_ITEM, SUBSELECT_ITEM, ROW_ITEM, CACHE_ITEM, TYPE_HOLDER, PARAM_ITEM

数据库连接代码

丁丁 16:01:23 (多人发送) import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Date; public class TestConnection { private static String url = "jdbc:mysql://59.76.57.32:3306/mytest"; private static String username = "root"; private static String password = "root"; private static Connection conn =null; private static Statement st = null; private static ResultSet rs = null; //为了限定对象的使用,所以讲构造方法私有化,那么,我可以对外只提供一个单独的实例对象 //单例模式--单独的一个实例的方法 private TestConnection() throws ClassNotFoundException, SQLException{ Class.forName("com.mysql.jdbc.Driver"); conn =DriverManager.getConnection(url,username,password); } public static Connection getConnection() throws SQLException, ClassNotFoundException{ new TestConnection(); return conn; } public static void main(String[] args){ //testBySelect(); testByInsert("叮当",25,"2011-3-11 15:50:33"); } public static void testByInsert(String name,int age,String date){ String sql="insert into st(name,age,dateByTest) values('"+name+"',"+age+",'"+date+"')"; System.out.println(sql); int flag = -1; try { conn = TestConnection.getConnection();

sql数据库示例,适合初学者

一、数据库概述 数据库(DataBase,DB):指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种用户或应用共享的数据集合。(文件系统) 数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中的数据。 数据库软件应该为数据库管理系统,数据库是通过数据库管理系统创建和操作的。 数据库:存储、维护和管理数据的集合。 二、数据库的安装与配置 * 安装 * 参照图解 * 一路下一步 * 配置 * 参照图解 * 到选择字符集时停 登录Mysql: mysql -u root -p abc * 卸载 1.停止mysql服务net stop mysql 启动mysql服务net start mysql 2.卸载mysql 3.找到mysql 安装目录下的my.ini datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/" * 修改密码 运行cmd * 安装成功了打开cmd --> mysql -uroot -p你的密码 * 修改mysql root用户密码 1) 停止mysql服务运行输入services.msc 停止mysql服务 或者cmd --> net stop mysql 2) 在cmd下输入mysqld--skip-grant-tables 启动服务器光标不动(不要关闭该窗口) 3) 新打开cmd 输入mysql -u root -p 不需要密码

C#-连接MYSQL数据库的3种方法及示例

C# 连接MYSQL数据库的方法及示例 连接MYSQL数据库的方法及示例 方法一: using MySql.Data using MySql.Data.MySqlClient; 其他操作跟SQL是差不多,无非就是前缀变成MySql了. 补充: 下面是连接字符串,供参考. MySqlConnection con = new MySql.Data.MySqlClient.MySqlConnection("Database='testdb';Data Source='localhost';User Id='db';Password='apple';charset='utf8'"); con.Open(); MySqlCommand cmd = new MySqlCommand(); cmd.Connection = con; 使用MYSQL推出的MySQL Connector/Net is an https://www.360docs.net/doc/6216354355.html, driver for MySQL 该组件为MYSQL为https://www.360docs.net/doc/6216354355.html,访问MYSQL数据库设计的.NET访问组件。 安装完成该组件后,引用命名空间MySql.Data.MySqlClient; 使用命令行编译时:csc /r:MySql.Data.dll test.cs 方法二: 通过ODBC访问MYSQL数据库 访问前要先下载两个组件:https://www.360docs.net/doc/6216354355.html,和MYSQL的ODBC驱动(MySQL Connector/ODBC (MyODBC) driver)目前为3.51版 安装完成后,即可通过ODBC访问MYSQL数据库 方法三: 使用CoreLab推出的MYSQL访问组件,面向.NET 安装完成后,引用命名空间:CoreLab.MySql; 使用命令编译时:csc /r:CoreLab.MySql.dll test.cs 以下为访问MYSQL数据库实例 编译指令:csc /r:CoreLab.MySql.dll /r:MySql.Data.dll test.cs using System; using https://www.360docs.net/doc/6216354355.html,; using System.Text; using CoreLab.MySql; using System.Data.Odbc; using MySql.Data.MySqlClient; class ConnectMySql {

一个完整的数据库示例--说明

一、表的结构及完整性约束 新建一个数据库jxsk,包括S、C、SC、T、TC五个表,结构如下:C表: S表: SC表: T表:

TC表: 二、安全性控制及视图机制 1、三类角色:depart、teacher、student depart的权限: teacher的权限:

student的权限: 2、有2个院系用户:d_jsj,d_xx,同属于depart角色。

有1个教师用户:t ,属于teacher 角色。

有一个学生用户:s,属于student角色。 3、创建计算机系教师视图t_view_jsj、计算机系学生视图s_view_jsj,并授予d_jsj 用户在这两个视图上的select、delete、update、insert权限。 计算机系教师视图t_view_jsj: create view t_view_jsj as select tno,tn,sex,age,prof,sal,comm,dept from t where dept='计算机' with check option

授予d_jsj用户在计算机系教师视图t_view_jsj 上的select、delete、update、insert 权限: grant select,update,delete,insert on t_view_jsj to d_jsj 计算机系学生视图t_view_jsj: create view s_view_jsj as select sno,sn,sex,age,dept,resume,native from s where dept='计算机' with check option 授予d_jsj用户在计算机系学生视图s_view_jsj 上的select、delete、update、insert 权限: grant select,update,delete,insert on s_view_jsj to d_jsj …… 4、创建一个视图,显示学号,姓名,院系,课程名,成绩。 create view score_view(学号,姓名,院系,课程名,成绩) as select s.sno,sn,dept,cn,score from s,sc,c where s.sno=sc.sno and https://www.360docs.net/doc/6216354355.html,o=https://www.360docs.net/doc/6216354355.html,o 三、完整性控制--触发器、规则 1、要求当删除C表中某课程信息时,同时删除SC和TC中与此课程相关的记录。create trigger c_delete_trigger on c after delete as delete from sc where cno in (select cno from deleted) delete from tc where cno in (select cno from deleted) go

Crystal Reports(水晶报表) JDBC连接mysql数据库

Crystal Reports 2008(水晶报表) JDBC连接mysql数据库 在本文中,主要介绍的是Crystal Reports 2008使用JDBC连接mysql数据库。 在连接之间,首先要确认你电脑上面都安装了mysql数据库。 其次,就是jdbc连接数据时候所使用的相关jar包。 接下来,就可以进行数据库的一些连接操作了。 对JDBC不是很了解的,可以到完整java开发中JDBC连接数据库代码和步骤了解相关的操作 1.打开Crystal Reports的数据专家 2.点击JDBC(JNDI)出现:

3.输入url和数据库类名,点击下一步:

4.输入password 和user id 点击完成即可。 5.不过,在这操作之前,你需要做的是以下步骤: 在你安装的Crystal Reports目录: 我安装的目录是:D:\crystal reports 2008\Common\4.0\java 在此目录下面,有一个文件:CRConfig.xml配置文件

D:\crystal reports 2008\Common\4.0\java\CRConfig.xml 1 2../.. 310 4 5 6 7 8 9 10CFKOA-YOTTM2M-OOUFAFF-N43M 11 12 13D:\crystal reports 2008\javasdk\bin 14D:\crystal reports 2008\Common\4.0\java/lib/mysql-connector-java-5.1.10-bin.jar;D:\c rystal reports 2008\Common\4.0\java/lib/crlovmanifest.jar;D:\crystal reports 2008\Common\4.0\java/lib/C RLOVExternal.jar;D:\crystal reports 2008\Common\4.0\java/lib/CRDBJDBCServer.jar;D:\crystal reports 2

JAVA连接各种数据库的代码大全

Java数据库连接大全 注:newInstance()可要可不要。 通用JDBC-ODBC直连方式(无需额外的驱动包): Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection conn=DriverManager.getConnection("jdbc:odbc:Driver={SQL Server};Server=localhost;uid=sa;pwd=1111;Database=db"); 以下方式中Class.forName中的都是需要添加的驱动包。 1Java连接Oralce Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url="jdbc:oracle:thin:@localhost:1521:orcl"; Connection conn=DriverManager.getConnection(url,user,password); 2Java连接MySQL Class.forName("org.gjt.mm.mysql.Driver").newInstance(); //Class.forName("com.mysql.jdbc.Driver"); String URL="jdbc:mysql://localhost/test"; Connection conn=DriverManager.getConnection(url,user,password); 3Java连接SQLServer 连接mssql2000 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); String URL="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db"; Connection conn=DriverManager.getConnection(url,user,password); 连接mssql2005+ Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance(); String URL="jdbc:sqlserver://localhost:1433;DatabaseName=db"; Connection conn=DriverManager.getConnection(url,user,password); 通用方式: Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance(); String url="jdbc:jtds:sqlserver://localhost:1433;DatabaseName=db"; Connection conn=DriverManager.getConnection(url,user,password); 4Java连接DB2 Class.forName(“com.ibm.db2.jdbc.app.DB2Driver").newInstance(); String URL=”jdbc:db2://localhost:5000/db"; Connection conn=DriverManager.getConnection(url,user,password); 5Java连接Infomix Class.forName("https://www.360docs.net/doc/6216354355.html,rmix.jdbc.IfxDriver").newInstance(); String URL="jdbc:informix-sqli://123.45.67.89:1533/db:INFORMIXSERVER=myserver"; Connection conn=DriverManager.getConnection(url,user,password); 6Java连接SyBase Class.forName("com.sybase.jdbc.SybDriver").newInstance(); Properties sysProps=System.getProperties(); SysProps.put("user","userid"); SysProps.put("password","user_password"); Connection conn=DriverManager.getConnection(url,SysProps);

数据库应用系统实例

淮海工学院计算机工程学院实验报告书 课程名:数据库原理及应用 题目:实验七数据库应用系统实例 班级:D计算机081 学号: 姓名:

一、实验目的 开发学生学籍管理系统小型数据库应用系统数据库连接、数据操程作序编写,熟练使用Microsoft Visual Studio 2005开发平台。 二、实验内容和要求 1.后台为SQL server2000, 2.前台为面向对象编程语言(可选择) 3.完成数据库连接 4.完成对前面实验所建立的studb109学籍数据库中的数据通过应用系统界面进行更新和查询等操作。 三、实验步骤和实验结果 1.连接SQL Server的数据库访问编程实例。编写一个应用程序来连接数据库名为studb109的SQL Sever数据库,并根据连接结果输出一些信息。 (1).运行Microsoft V isual Studio 2005 (2).新建网站

(3).设计网站 using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.Data.SqlClient; namespace web { public partial class_Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e){} protected void Button1_Click(object sender, EventArgs e) {try {SqlConnection coon = new SqlConnection(); coon .ConnectionString =" Server =localhost; uid = sa;pwd=; database=studb109"; coon .Open (); Label1 .Text ="连接成功"; } catch { Label1 .Text ="连接失败"; }}}}

vs2010连接mysql数据库方法

Vs2010连接Mysql数据库方法 下载MySQL 5.5.13 正式版:https://www.360docs.net/doc/6216354355.html,/html/361.html ------------------------------------------- 操作系统:winxp-32bit 数据库:MySQL Server 5.5 (安装路径:D:\Program Files\MySQL\MySQL Server 5.5) IDE: Microsoft Visual Studio 2010 untimate/Professional (以上东西都是完整安装的) ------------------------------------------- 一、VC设置 1、新建一个工程,随便写一个helloworld,目的是就是让工程下的“debug”文件夹出现 2、把D:\Program Files\MySQL\MySQL Server 5.5\lib下面的libmysql.dll复制到工程的debug文件夹里面 3、接下来要设置一些引用文件的环境变量,首先,点击项目->属性->vc++目录。 然后“include目录”那把“D:\Program Files\MySQL\MySQL Server 5.5\include”给加进来 再然后“lib目录”那里把“D:\Program Files\MySQL\MySQL Server 5.5\lib”也一起加进来 VC6.0设置: (1)打开VC6.0 工具栏Tools菜单下的Options选项,在Directories的标签页中右边的“Show directories for:”下拉列表中选中“Includefiles”,然后在中间列表框中添加你本地安装MySQL的include目录路径。(我的是D:\Program Files\MySQL\MySQL Server 5.5\include)。 (2)在上面说到的“Show directories for:”下拉列表中选中“Library files”,然后添加你本地安装MySQL的Lib目录路径。Lib目录下有debug目录,选debug。(我的是D:\Program Files\MySQL\MySQL Server 5.5\lib\debug)。 4、然后在项目->属性窗口下点击:连接器->输入->附加依赖项,把"libmysql.lib"写进去VC6.0设置:在“Project settings->Link:Object/library modules”里面添加“libmysql.lib”。 使用VC++编译时再添加以下项: 5、在stdafx.h里面添加如下的内容: #include "mysql.h" #include "winsock.h" // 如果编译出错,则把该行放到#include "mysql.h"之前#pragma comment(lib,"libmySQL.lib") // 如果在附加依赖项里已增加,则就不要添加了 二、数据库的相关操作 1、打开“开始->所有程序->MySQL->MySQL Server 5.5->MySQL Command Line Client.exe”,如果有密码就输入密码,没有设置密码就直接按回车,会提示服务器启动成功。

数据库图书系统(含代码)

目录 一.需求描述和系统边界 数据库技术和Internet的飞速发展,使它们已经成为现代信息技术的重要组成部分,是现在计算机信息系统和计算机应用系统的基础和核心。对于任何一个企业来说,数据是企业重要的资产,如何有效利用这些数据,对于企业发展起着极其重要的作用。随着我国市场经济的迅速发展和人们生活水平的不断提高,图书馆藏书的数目逐渐增大,这也挑战了图书管理方面的技术,以前的人工管理方式已经不再适应现在的环境,取而代之的是先进的图书管理系统,创建图书管理系统可以让管理人员方便而快捷的进行管理、查询、借阅、录入等工作。 该图书管理系统支持2类用户:管理员和读者。读者可以进行借阅、续借、归还和查询书籍等操作,管理员可以完成书籍和读者的增加,删除和修改以及对读者,借阅、续借、归还的确认。 二.需求分析 1.业务需求 图书管理系统的主要业务包括:包括图书馆内书籍的信息,读者信息,以及

借阅信息。此系统功能分为面向读者和面向管理员两部分,其中读者可以进行借阅、续借、归还和查询书籍等操作,管理员可以完成书籍和读者的增加,删除和修改以及对读者,借阅、续借、归还的确认。 2.功能需求及数据需求分析 (1)注册管理 管理员注册。管理员注册时要求填写基本信息,包括管理员编号、姓名、性别、联系电话、家庭住址。系统检查所有信息填写正确后管理员注册成功。 读者注册。读者注册时要求填写基本信息,包括读者编号、姓名、性别、联系电话、学院等。系统检查所有信息填写正确后读者注册成功。 (2)图书管理 增加图书信息。当有新的图书入库时,管理员负责添加图书信息,包括书名、分类、图书编号、作者、出版社、出版时间、简介等。 图书信息查询。管理系统需提供方便快捷的方式进行图书检索。如可以输入指定的关键词进行简单查询,也可以根据书名、分类、图书编号、作者、出版社、出版时间、简介等单一或组合条件进行查询。 图书信息更新及删除。图书信息发布后,管理员可以随时更新和删除图书信息。 (3)借阅图书 读者登入图书管理系统之后,将需要的图书的信息输入,可以借阅图书。由管理员将图书信息修改为“不在馆”。 (4)续借图书 读者借书之后,一个月后应归还。如有需要可以续借图书30天。此操作由管理员完成。 (5)归还图书 读者将已借图书归还给图书馆时,需要管理员确认信息。并将图书信息修改为“在馆” 3.业务规则分析 基于功能需求,通过进一步了解,图书管理业务需求如下: (1)所有用户均可以搜索图书信息。但只有管理员可以对图书信息进行修改。

连接MYSQL数据库

连接MySQL 数据库 本文档说明如何设置从NetBeans IDE 6.7 到MySQL 数据库的连接。连接后,即可通过执行以下操作开始在IDE 的数据库资源管理器中使用MySQL:创建新的数据库和表、在表中填充数据,并对数据库结构和内容运行SQL 查询。本教程是专门为那些对数据库管理有基本了解,并想要运用其知识在 NetBeans IDE 中使用MySQL 的初学者而设计的。 MySQL是一种常见的开源关系数据库管理系统(Relational Database Management System, RDBMS),由于其速度、灵活性和可靠性而常用于Web 应用程序中。MySQL 使用SQL(即Structured Query Language,结构化查询语言)访问和处理数据库中包含的数据。 预计时间:30分钟 目录 ?配置MySQL 服务器属性 ?启动MySQL 服务器 ?创建并连接到数据库 ?创建数据库表 ?使用表数据 ?运行SQL 脚本 ?另请参见 要学习本教程,您需要具备以下软件和资源。 软件或资源要求的版本 NetBeans IDE 6.8、6.7 或6.5 Java 下载 Java Development Kit (JDK)版本6 或版本5 MySQL 数据库服务器版本5.x 注意:本教程假设已在计算机上安装并配置了MySQL RDBMS。如果是首次安装,请查阅正式的MySQL 文档以寻求帮助。还可以参阅在Windows 操作系统中设置MySQL 数据库服务器。 配置MySQL 服务器属性 NetBeans IDE 6.8 支持MySQL RDBMS。访问NetBeans IDE 中的MySQL 数据库服务器之前,必须先配置MySQL 服务器属性。 1.在“服务”窗口中,展开“数据库”节点,右键单击“MySQL 服务器”节点并选择“属性”。 “MySQL 服务器属性”对话框打开。

Java连接mysql数据库源代码

Java连接mysql数据库源代码 /** *@author mervyn *@Development_time 2011.3.12 *welcome to https://www.360docs.net/doc/6216354355.html,/mervyn_hb */ package src; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.sql.*; import java.util.*; public class MysqlConnectSystem { /** * @param args * @throws IOException */ public static void main(String[] args) throws SQLException, IOException { String Usename,KeyID,UrlString; //String DriverConnect; char MenuExitValue; String driver="com.mysql.jdbc.Driver"; Scanner EntryValue=new Scanner(System.in); System.out.println("欢迎使用MysqlConnectSystem信息管理系统!"); MysqlConnectSystem mysqlconnect=new MysqlConnectSystem(); MysqlConnectSystem mysqlinsert=new MysqlConnectSystem(); MysqlConnectSystem mysqlupdate=new MysqlConnectSystem(); MysqlConnectSystem mysqldelete=new MysqlConnectSystem(); System.out.println("请输入要登录的用户名:"); Usename=EntryValue.next(); System.out.println("请输入要登录的数据库的密码:"); KeyID=EntryValue.next(); System.out.println("请输入需要登录的数据库:"); UrlString="jdbc:mysql://127.0.0.1:3306/"+EntryValue.next(); do{ try { Class.forName(driver); Connection conn=DriverManager.getConnection(UrlString, Usename,

mysql5.7.4数据库源码安装20150520

mysql数据库源码安装 1、安装环境 系统: Red Hat Enterprise Linux Server release 6.4 (Santiago)64位 CUP 4核内存8G硬盘空间160G 系统分区 /boot 300M /swap 4096M /home 102400M 把剩余全部空间分给根分区。 mysql源码包版本:mysql-5.7.4-m14.tar.gz 2 、升级cmake到2.8.9版本查看系统cmake 版本rpm -qa cmake 或cmake --version [root@gztestC118 home]# rpm -qa cmake cmake-2.6.4-5.el6.x86_64 [root@gztestC118 home]# cmake --version cmake version 2.6-patch 4 [root@gztestC118 home]#rpm -e cmake-2.6.4-5.el6.x86_64 删除旧的cmake [root@gztestC118 home]# tar –zxvf cmake-2.8.9.tar.gz [root@gztestC118 home]# cd cmake-2.8.9 [root@gztestC118 home]./configure [root@gztestC118 home]make &&make install [root@gztestC118 ~]# cmake –version 检查新版本号 cmake version 2.8.9 升级成功。 3、拷贝好RHEL系统镜像进入目录Packages [root@gztestC117 Packages]# ll *curses* 把下面安装包安装下。 -r--r--r--. 1 root root 274016 5月 12 06:16 ncurses-5.7-3.20090208.el6.x86_64.rpm -r--r--r--. 1 root root 62400 5月 12 06:16 ncurses-base-5.7-3.20090208.el6.x86_64.rpm -r--r--r--. 1 root root 656772 5月 12 06:16 ncurses-devel-5.7-3.20090208.el6.i686.rpm -r--r--r--. 1 root root 657088 5月 12 06:16 ncurses-devel-5.7-3.20090208.el6.x86_64.rpm -r--r--r--. 1 root root 256596 5月 12 06:16 ncurses-libs-5.7-3.20090208.el6.i686.rpm -r--r--r--. 1 root root 251756 5月 12 06:16 ncurses-libs-5.7-3.20090208.el6.x86_64.rpm -r--r--r--. 1 root root 559700 5月 12 06:16 ncurses-term-5.7-3.20090208.el6.x86_64.rpm [root@gztestC117 Packages]# rpm -ivh ncurses-5.7-3.20090208.el6.x86_64.rpm warning: ncurses-5.7-3.20090208.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY

VBA数据库连接代码(自己编制成功)

Private Sub CommandButton1_Click() Dim i As Integer, j As Integer, sht As Worksheet 'i,j为整数变量;sht 为excel工作表对象变量,指向某一工作表 Dim cn As Object '定义数据链接对象,保存连接数据库信息 Dim rs As Object '定义记录集对象,保存数据表 Set cn = CreateObject("ADODB.Connection") '创建数据链接对象 Set rs = CreateObject("ADODB.RecordSet") '创建记录集对象 Dim strCn As String, strSQL As String '字符串变量 strCn = "Provider=sqloledb;Server=GuilinHu-PC\HuglSQLSEVER;Database=Hugl;U id=sa;Pwd=HGL102643lch;" '定义数据库链接字符串 ’Sever =服务器名称;Database =数据库名称,Uid =sa ; Pwd = 以sa身份登录数据库的密码 '下面的语句将读取数据表数据,并将它保存到excel工作表中:画两张表想像一下,工作表为一张两维表,记录集也是一张两维表 strSQL = "select 姓名,性别,年龄 from 个人信息" '定义SQL查询命令字符串cn.Open strCn '与数据库建立连接,如果成功,返回连接对象cn rs.Open strSQL, cn '执行strSQL所含的SQL命令,结果保存在rs记录集对象中 i = 1 Set sht = ThisWorkbook.Worksheets("sheet1") '把sht指向当前工作簿的sheet1工作表 Do While Not rs.EOF '当数据指针未移到记录集末尾时,循环下列操作 sht.Cells(i, 1) = rs("姓名") '把当前记录的字段1的值保存到sheet1工作表的第i行第1列 sht.Cells(i, 2) = rs("性别") '把当前字段2的值保存到sheet1工作表的第i行第2列 sht.Cells(i, 3) = rs("年龄") '把当前字段2的值保存到sheet1工作表的第i行第2列 rs.MoveNext '把指针移向下一条记录 i = i + 1 'i加1,准备把下一记录相关字段的值保存到工作表的下一行 Loop '循环 rs.Close '关闭记录集,至此,程序将把某数据表的字段1和字段2保存在excel工作表sheet1的第1、2列,行数等于数据表的记录数 End Sub

相关文档
最新文档