浏览 12197 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2003-10-17
mail:flashc@21cn.com 如果你不想看太多废话直接看下面3句话就ok了 解决方法的主要手段: 1.mysql的授权用户权限必须@%而不是@localhost 2.jsp使用jdbc驱动连接数据库的连接字符实际上应该算远程访问 3.切记:@%代表在远程的权限,@localhost实际上只有在本机的权限 也许我太笨了,折磨了我一个多月吧,这个问题,一直没法连接到数据库上,头都大了因我安装mysql后习惯删除user表里的3个多余的帐号,以加强安全,所以这个问题一直没解决掉(但我想不删也好象一样有问题吧?毕竟那几个帐号都不是@%的),总是找不到原因,在CU的斑竹的提示下(虽然没给我实际解决的方法,但我还是要谢谢他们),后来根据出错信息查了一下国外的BBS,找到了一个类似的回答同样的错误,不过一个老外提示说把连接字符串里的localhost换成实际的域名或者IP我试了一下,没效,不过我突然想了下,又加了一个帐号@%的试验,成功了!心情很爽,再也不用郁闷了,还有,说一下,mysql这个数据库只有root帐号能有管理的特权,其他帐号是没权限动它的。 希望我的心得能给别人带来些帮助! 下面是测试用的jsp脚本,测试前请确保你的test数据库里面有个test表,随便填 两个字段和输入几行数据。 <%@ page contentType="text/html;charset=gb2312"%> <%@ page import="java.sql.*"%> <html> <body> <%Class.forName("com.mysql.jdbc.Driver").newInstance(); String url ="jdbc:mysql://localhost/test?user=test&password=test&useUnicode=true&characterEncoding=8859_1" ; //假设test是你的数据库 Connection conn= DriverManager.getConnection(url); Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); String sql="select * from test"; //从test表读数据 ResultSet rs=stmt.executeQuery(sql); while(rs.next()) {%> 您的第一个字段内容为:<%=rs.getString(1)%> 您的第二个字段内容为:<%=rs.getString(2)%> <%}%> <%out.print("数据库操作成功,恭喜你");%> <%rs.close(); stmt.close(); conn.close(); %> </body> </html> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2003-10-17
呵呵,这个问题确实难倒了很多人,记得原来在jdon上有一个叫做什么sinon_fang的自称自己用了两年的mysql,也是连个这个基本的问题都不懂,还大骂mysql不正常。
我补充几句: 1、空用户连接必须删除,否则会带来很多麻烦 2、在Unix上,localhost连接不使用TCP协议,使用的是Unix Socket协议,在这种情况下,你就算关闭3306端口,也不会影响程序访问数据库。例如你在PHP中访问数据库就是这种情况。但是Unix Socket连接吞吐量没有TCP连接大,建议用TCP连接。 例如本论坛原来就是使用Unix Socket,现在已经被我改为TCP了。 3、JDBC连接是基于TCP协议的,就算你写localhost,也肯定使用TCP协议,这需要你打开相应的访问权限。PHP只所以可以使用Unix Socket,是因为PHP是调用底层的MySQL C API访问数据库,不必通过网络端口调用。 4、安装MySQL之后第一件事情: #mysql connect mysql; delete from user where user=''; grant all mysql.* to root@"localhost" identified by "password" with grant option; grant all mysql.* to root@"%" identified by "password" with grant option; quit 这样就不必担心连接问题了。以后添加新的用户,照此办理。 另外在Linux上推荐使用iptables封掉3306端口,这样安全了,只允许本机程序访问,不允许外部访问。 |
|
返回顶楼 | |
发表时间:2003-10-17
robbin 写道 呵呵,这个问题确实难倒了很多人,记得原来在jdon上有一个叫做什么sinon_fang的自称自己用了两年的mysql,也是连个这个基本的问题都不懂,还大骂mysql不正常。
呵呵,我们这里就是要反对一切形式的神秘主义和伪专家。 |
|
返回顶楼 | |
发表时间:2003-10-17
我安装了MySQL后,用winmysqladmin新建一个账号,然后把其它都删掉。这样就很安全,也算是一个简便方法
|
|
返回顶楼 | |
发表时间:2004-10-25
robbin 写道 但是Unix Socket连接吞吐量没有TCP连接大,建议用TCP连接。
例如本论坛原来就是使用Unix Socket,现在已经被我改为TCP了。 我记得Domain Socket的效率是远远高于TCP的啊?而且从概念上也很容易理解,Socket省略了校验、失序、组合这些颇为耗时的过程, 在效率上要高于TCP不少,即使本机的TCP可能会利用回环接口提高效率,但它还是比不上本机的Socket。即便考虑到这些方式的实现在 不同的系统上效率的差别,总体上Socket还是优于TCP的,这些应该是不争的事实。 不知“Unix Socket连接吞吐量没有TCP”的说法从何得出,是否有出处?或者是否经过验证? 我这里一直用的是Socket,没感觉到什么瓶颈,不过我们没有跟TCP做过对比。基于上学时和书本中的经验,一直认为Socket优于TCP。 另外既然MySQL同时提供了Socket和TCP两种实现方式,在本机上又以Socket为默认实现,肯定是有它的道理在的。Socket一直被本机 CS应用广泛使用,例如X之类,它应该也是经得起考验的。 也许自己是孤陋寡闻,还请指点。 局限到某个系统也许是有意义的,我这里用的是Linux。 |
|
返回顶楼 | |
发表时间:2004-10-25
就拿这台服务器来说吧,开始的时候,用的是Unix Socket,当时是Linux Kernel2.4,只要数据库连接数量一多,就会出现连接不上的错误,UnixSocket Error,后来改成了TCP/IP,立刻就好了。
现在服务器升级到了Linux Kernel2.6,我没有再改回去过测试,不过我的印象当中始终对Unix Socket大连接量不放心,我说得吞吐量就是指并发大量数据库连接下的稳定性。 |
|
返回顶楼 | |
发表时间:2004-10-26
没看明白,反正我能用localhost就用localhost
允许远程访问是很危险地,特别是允许任意IP访问 |
|
返回顶楼 | |
发表时间:2004-10-26
明白了。我那里的情况是数据库的连接数一直不是太多,但每个连接的数据量巨大,这时
用UNIX Domain Socket显然没有问题,我这里已经得到验证,并且由于Socket的效率 明显高于TCP,所以这时Domain是首选。 你这里的情况是连接数很多,用UNIX Socket会出错,所以TCP变成了首选。 对Linux IPC和网络栈不太熟悉,不清楚为什么Socket会在大连接数时报错,猜想是不 是Linux里Domain Socket设计的缺陷,或者默认可用的Sockt数太少。 Any way,这些都是有用的经验。 对了,我这里也是Linux 2.4。 |
|
返回顶楼 | |
发表时间:2004-10-26
我觉得应该是Linux 默认允许的Unix Socket数量上可能有限制,当然这也是我的猜想而已。我也没有找到任何地方有提到Unix Socket连接上有什么问题的文档,只是自己的实际经验。
另外允许TCP/IP并不会不安全,你可以只grant 127.0.0.1的访问权限,那么也只有本机可以访问,任何其他机器都无法访问。 |
|
返回顶楼 | |
发表时间:2005-06-13
MySQL 4.x版本的密码是新的长密码,使用grant all mysql.* to root@"localhost" identified by "password" with grant option; 建立的密码用JDBC2.0连接可能会出问题,如果发现连不上,建议修改密码:UPDATE user SET password=OLD_PASSWORD("your password") WHERE ...
你会发现修改后的密码加密串比原密码短了,呵呵,用PHP连接出问题也可以试试修改成OLD_PASSWORD,对于MySQL 4.x以前的版本就不会出现这种问题。 |
|
返回顶楼 | |