免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 7525 | 回复: 28
打印 上一主题 下一主题

为什么很多人不支持把文件存在数据库里面?回答不了不要进 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-07-29 03:53 |只看该作者 |倒序浏览
我对JAVA不是很熟。以前主要从事C、C++

最近花了点时间,研究了一下把文件通过JSP应用存到数据库里面。。
1、从客户端获得 request.getInputStream,读到byte[]里面。客户端的form中含有文件域和其他类型的输入框的域,如text,textarea,checkbox,file等等;
2、对byte进行解析,转成String,应该是ASCII,根据-----------xx数据分割段进行解析,判断里面是否含有name,filename
    如果是name,则读到String里面去;
   如果含有filename,则把下面的数据段读到ByteArrayOutputStream里面去,然后在转换成byte[]数组。
3、现在已经实现了读到byte[]数组,并且通过 response.打印byte 能在网页上显示图片。所有图片都能正确显示。。其他域里面的String也读到对应变量中去了。

4、我现在想弄清楚的问题有2
    如何把byte[]写到mysql的blob字段里面

   为什么很多人都反对把文件存到数据库里面?据我从网上得到的反馈信息是 很多JAVA程序员认为 将文件插到数据库里面,会影响数据库的性能,理由呢?为什么会影响数据库性能?
   我的分析是:当然随着数据量的增加,数据库的性能是会降低,主要由于数据文件多了,磁盘需要转多次才能找到数据文件。同时数据库里面插入大量数据,也会增加磁盘文件碎片,这个主要是由于各类数据库的数据文件结点发生变化。。。但这不是理由啊,因为你插入其他大量数据,也会增加数据文件空间啊。

   假如不把文件存到数据库里面,如果直接放到一个目录下,如何实现对这些文件的权限管理?

   说实话,我挺瞧不起有些个别 AVA程序员的,因为感觉他们大部分的情况下都是站在别人的肩膀上去完成一件事,当然这对于整个工程是有利的,因为可以很快去完成一件事,而不需要关心其他东西,但是最后造成的就是这些所谓的程序员不求甚解。这个问题,我在多个论坛请教过,我问他们,如何将二进制文件插到数据库,他们一般的回答就是有现成的JAR包,还有就随便描述一下流程,但是很多细节的事情,他们自己还没做过,还有的回答就是建议不要插到数据库里面,因为会影响性能,但具体理由没说清楚。。

   望能者辩之,不能者止。

论坛徽章:
0
2 [报告]
发表于 2006-07-29 10:36 |只看该作者
原帖由 sishanji 于 2006-7-29 03:53 发表
我对JAVA不是很熟。以前主要从事C、C++

最近花了点时间,研究了一下把文件通过JSP应用存到数据库里面。。
1、从客户端获得 request.getInputStream,读到byte[]里面。客户端的form中含有文件域和其他类型的输 ...

真不知道这位兄弟是否了解jdbc.建议你先看看它,在来了解怎么把二进制文件放到数据库里面。

论坛徽章:
0
3 [报告]
发表于 2006-07-29 14:28 |只看该作者
原帖由 sishanji 于 2006-7-29 03:53 发表
我对JAVA不是很熟。以前主要从事C、C++

最近花了点时间,研究了一下把文件通过JSP应用存到数据库里面。。
1、从客户端获得 request.getInputStream,读到byte[]里面。客户端的form中含有文件域和其他类型的输 ...

你自己都不会 还看不起别人  问题太简单了 不好意思回答
你自己学习jdbc去吧   如果有兴趣你可以自己写个驱动

论坛徽章:
0
4 [报告]
发表于 2006-07-29 16:00 |只看该作者
文件写入DBMS的开销是存在的,在网页中大多数人还是喜欢使用src="filename"这种方式。当文件数量较多时,Web容器执行lookup操作花费的时间和DBMS取出文件的时间的差别没测试过,应该和具体应用有关。
将文件写入数据库的好处是可以利用DBMS的备份、事务等优点。放入文件系统有利于普通用户进行维护。采用什么方案应该是和系统的总体方案有关的,对于小型应用来说放入文件系统也没什么坏处。
在文件系统中的文件权限控制也十分容易实现,将文件存储到Web容器以外的地方,通过Sevlet来返回文件给授权用户也是一种可行的方案,不过配置相对麻烦一点。
将byte[]写入DBMS的BLOB列中,可以采用以下方式:
1、直接使用JDBC中的java.sql.BLOB类,将byte[]写入或读出,写的时候SQL语句要要加上for update之类的子句,MYSQL我没用过,可以查一下手册
2、在支持O/R映射的系统中加入@Lob注释,由容器自动完成,写一个JSF前端进行控制

论坛徽章:
0
5 [报告]
发表于 2006-07-30 14:43 |只看该作者
jinijxta 回答不错,我很欣赏那种对问题追根究地的精神。

tong0245
两位,说实话,我对你很瞧不起。
我已经自己研究出来了,
使用preparedment类创建对象,
直接setBytes就可将二进制数据插入到数据库里的blob,用getBytes就可以去。

跟我提JDBC,你可以知道所有JDBC里面的那些什么类啊,方法啊,又怎么样?
通过JDBC连数据库,虽然我不懂JAVA,但我稍微分析了就了解了基本原理

数据库服务器原理
1、文件管理机制,即数据库数据文件的组织形式,比较复杂的数据库系统是将文件直接存储在裸设备上;
2、标准SQL解析,根据SQL语句解析成数据库的文件增、删、改;
3、开启SOCKET服务,监听请求。这是最简单的,但也要设定访问协议。

JDBC说到底就是连数据库服务器监听服务的客户端,发送SQL,接受反馈数据流,只要知道数据库服务器的协议就可以写所谓的JDBC了。
所以啊,tong0245 别拿什么JDBC来吓我。

我以前在HP上用C和C++写过两个WEB服务器和数据库服务器,但是不太好用,查询速度比较慢,只主要是我的文件管理机制没有做优化,一些函数的算法太简陋。昨天查了下MYSQL的资料,基本上还是按照操作系统提供的文件系统进行数据存储的,所以将文件存在数据库,所以与文件系统上的存储是一样的。

论坛徽章:
0
6 [报告]
发表于 2006-07-30 19:51 |只看该作者
其它数据库俺不知道但ORACLE数据库的对大型数据存储的发展是从直接把文件存入数据库过度到不把文件存入数据库的  俺不清楚是ORACLE为什么要这么做 但ORACLE都推荐不把文件存入数据库一定是有道理的  
还有好比社会的发展需要 规格化的生产 我觉得JAVA的包就好比规格化的生产  利大于弊的  如果 你要显示自己的才能 那么我建议你自己开发种语言  


有工具不用 呆子

论坛徽章:
0
7 [报告]
发表于 2006-07-31 06:32 |只看该作者
原帖由 sishanji 于 2006-7-29 03:53 发表
我对JAVA不是很熟。以前主要从事C、C++

最近花了点时间,研究了一下把文件通过JSP应用存到数据库里面。。
1、从客户端获得 request.getInputStream,读到byte[]里面。客户端的form中含有文件域和其他类型的输 ...

因为你说的不是人话 我告诉 没有人权利有 看不起别人(我说的普通人 不包括罪犯  道德败坏者) .
这是做人的基本道理 不说人话 我首先看不起你 你学习学习做人吧.
我长这么大 还真是从来没有看不起 谁过 穷的 富的 有文化 没有文化.

[ 本帖最后由 tong0245 于 2006-7-31 06:33 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-07-31 11:38 |只看该作者
不错。搬个板凳来看。java版,似乎从来没有冷清过。呵呵~~

不过上次的老好人。这次变成被攻击目标了。

论坛徽章:
0
9 [报告]
发表于 2006-07-31 12:17 |只看该作者
sishanji用c++写的数据库支持什么东西?说一说

论坛徽章:
0
10 [报告]
发表于 2006-07-31 12:25 |只看该作者
java 和C++各有所长 不能用其长处和其短处相比的
试问 要你会用C++去开发B/S 的系统吗??
  会用JAVA去开发工业设备控制程序吗??
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP