一亿数据的主键用 Varchar128 和 bigint 数据存储空间相差多大?

背景

近期开发过程中的简单问题,整理一下。

数据库字段类型选择

数据库设计过程中,选择合适的类型,可以极大提高磁盘空间的利用率。使用 TokuDB 数据库引擎的某张表的主键,由原来的 128 位的 varchar 类型,改为 bigint 类型后,相同数据规模下,发现数据库文件大小减少了一半。

效果非常明显:原来一亿条记录的字符串主键类型,需要7G左右磁盘空间,改为数值存储后,只需要3G左右的磁盘空间,大大减少了磁盘消耗。

启示:字段类型按需选择,MySQL 的客户端 HediSQL 在编辑表字段时,可以看到各种类型所表示的数据范围。hour 类型可以选择 tinyint,端口类型 smallint (正好跟端口号的0-65535一致)。还有时间字段,字符串最大 20 即可。

Tomcat连接池问题

使用 Tomcat 数据源配置后,Java Web 启动过程中会报 mysql 驱动 jar 包找不到,虽然已经将 jdbc 驱动添加到项目的 lib 目录下了,但是还是出现这个问题。

原因是 Tomcat 数据源是依赖 jdbc 的 jar 包的,所以还必须将其放在 tomcat 的 lib 目录下。但是使用其他数据源,就不需要再放在 tomcat 的 lib 目录了。

Spring配置文件

我们使用 SpringMVC 时,需要在 web.xml 中添加两个配置信息,SpringMVC 的初始化配置信息和 Spring 的配置信息:

<!-- 初始化spring配置文件 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			classpath*:config/applicationContext.xml
		</param-value>
	</context-param>
<!-- spring MVC初始化 -->
	<servlet>
		<servlet-name>dispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet
		</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:config/applicationContext-mvc.xml
			</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

applicationContext-mvc.xml 和 applicationContext.xml文件,他俩的区别和联系是什么呢?前者是 SpringMVC 的初始化配置信息,后缀是 Spring 的 Bean 配置文件。

Spring 作为一个 Bean 工厂,它需要管理所有配置的 Bean 的信息,项目中所有需要的Bean 都应该在该文件中定义,如果配置文件过多,可以分别写多个 xml文件,然后在applicatonContext.xml 使用 resource 标签引入,但是必须保证引入路径的正确。

SpringMVC,作为一个 MVC 框架,它的配置文件中主要是 DispatcherServlet 所需要的Bean 的配置,并利用它们来处理 Request 请求和生成相应的视图返回。

摘要算法的选择

项目中的密码存储方式是 MD5 摘要的16进制格式的数据,但是据说 MD5 算法已经被破解了,所以更换了另一种摘要生成算法 SM3。

摘要算法,是不可逆的,并不存在解密之说,在数字签名中使用 MD5,是为了保证数据的真实性、不可抵赖的特性。

而加密算法的作用是保证数据的完整性,通常加密算法都是可逆过程,需要解密得到明文数据的。

启示录

检查代码时发现一个单独配置 spring-mail.xml 中的 Bean 的定义又在applicationContext.xml 文件中定义了一遍,而该文件中已经用 resource 引入了spring-mail.xml 配置文件,但是被注释掉了。

仔细一看,才发现被注释掉的 resource 的配置路径错误了,修正后并删掉applicationContext.xml 中关于 spring-mail 的 bean 配置,直接通过文件引用就可以了。

解决这个遗留问题后,就想到了 spring 和 springMVC 配置文件直接的区别和联系了。自己想想就想明白它们的区别和作用的。编码时间久了,有些技术用着用这顺带知其所以然了。书读百遍,其义自见,大概就是这种体验吧!

此外,喝水的时候果真不能思考,否则会忘记喝水而被呛着的,这也是程序员一大风险!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值