
指的是如果在某次使用或者某段程序中没有正确地关闭Connection、Statement和ResultSet资源,那么每次执行都会留下一些没有关闭的连接,这些连接失去了引用而不能得到重新使用,因此就造成了数据库连接的泄漏。数据库连接的资源是宝贵而且是有限的,如果在某段使用频率很高的代码中出现这种泄漏,那么数据库连接资源将被耗尽,影响系统的正常运转。
你在搜索框里输入关键字,比如:123或者abc,
邮件搜索系统就会搜出所有包含:123或者abc的邮件,附件,记事,
已发送的邮件包含123的,已受到的邮件包含123的
网易邮箱怎么关闭二次验证之前由于网易邮箱数据被泄漏,让用户们都为安全性而担忧, 开启了二次验证,来增强邮箱的安全性。但现在有些用户想关闭二次验证,那网易邮箱二次验证怎么关闭呢下面就由小编为大家介绍关闭二次验证的方法,具体请看下文!
网易邮箱怎么关闭二次验证:
1、登录邮箱后,点击邮箱上方的“设置”--页面左侧“邮箱安全”--“登录二次验证”
2、在邮箱登录二次验证页面,点击“关闭邮箱登录二次验证”后点击“确定”
3、点击“发送验证码到手机”,输入验证码后点击“确定”即可关闭
以上就是小编给大家带来的网易邮箱关闭二次验证的方法,希望对大家有所帮助!
亲,您好,1、登录邮箱后,点击邮箱上方的“设置”--页面左侧“邮箱安全”--“登录二次验证”,2、在邮箱登录二次验证页面,点击“关闭邮箱登录二次验证”后点击“确定”,3、点击“发送验证码到手机”,输入验证码后点击“确定”即可关闭, 希望我的解答对您有所帮助啦, 最后再次祝您身体健康,心情愉快! 要是我的解答对您有所帮助,还请给个赞(在左下角进行评价哦),期待您的赞,您的举手之劳对我很重要,您的支持也是我进步的动力。最后再次祝您身体健康,心情愉快!
您好,取消189邮箱的二次验证方法:点击“个人设置”的“设置密码”,“用于二次验证”的选项选择为“否”即可 详情 在线客服 官方服务 官方网站费用查询充值交费业务办理宽带提速点击“个人设置”的“设置密码”,“用于二次验证”的选项选择为“否”即可。了解更多服务优惠点击下方的“官方网址”客服220为你解答
为增强邮箱的安全性,网易邮箱推出了一个二次验证功能,这个功能是网易邮箱50版推出的,您可以在登录出现异常或者每次登录时,进行除密码之外的第二重验证,通过验证才可登录使用邮箱!下边就为大家介绍一下如何开启和关闭网易邮箱的这个二次验证功能
一、开启登录二次验证:
1、登录163邮箱,从邮箱正上方点击“设置”——>“邮箱安全”——>“登录二次验证”;
如何设置邮箱登录二次验证功能?
2、点击“手机短信”验证方法;
如何设置邮箱登录二次验证功能?
3、输入您的“邮箱密码”,然后点击“确定”;
如何设置邮箱登录二次验证功能?
4、选择您需要的“验证方式”即可完成设置;
(一旦您想更换验证的手机号码或者关闭此功能,只需此打开功能页,点击相应功能按钮即可。)
如何设置邮箱登录二次验证功能?
5、当您再次登录邮箱且符合验证规则,系统会自动提示您需要完成手机验证才能进入邮箱。
如何设置邮箱登录二次验证功能?
二、关闭登录二次验证:
1、登录邮箱后,点击邮箱上方的“设置”–页面左侧“邮箱安全”–“登录二次验证”,如下图;
如何开启/关闭邮箱登录二次验证功能?
2、在邮箱登录二次验证页面,点击“关闭邮箱登录二次验证”后点击“确定”。
如何开启/关闭邮箱登录二次验证功能?
3、点击“发送验证码到手机”,输入验证码后点击“确定”即可关闭。
如何开启/关闭邮箱登录二次验证功能?
简介:
本文介绍如何在 Android 检测 Cursor 泄漏的原理以及使用方法,还指出几种常见的出错示例。有一些泄漏在代码中难以察觉,但程序长时间运行后必然会出现异常。同时该方法同样适合于其他需要检测资源泄露的情况。
最近发现某蔬菜手机连接程序在查询媒体存储(MediaProvider)数据库时出现严重 Cursor 泄漏现象,运行一段时间后会导致系统中所有使用到该数据库的程序无法使用。另外在工作中也常发现有些应用有 Cursor 泄漏现象,由于需要长时间运行才会出现异常,所以有的此类 bug 很长时间都没被发现。
但是一旦 Cursor 泄漏累计到一定数目(通常为数百个)必然会出现无法查询数据库的情况,只有等数据库服务所在进程死掉重启才能恢复正常。通常的出错信息如下,指出某 pid 的程序打开了 866 个 Cursor 没有关闭,导致了 exception:
3634 3644 E JavaBinder: Uncaught remote exception! (Exceptions are not yet supported across processes)
3634 3644 E JavaBinder: androiddatabaseCursorWindowAllocationException: Cursor window allocation of 2048 kb failed # Open Cursors=866 (# cursors opened by pid 1565=866)
3634 3644 E JavaBinder: at androiddatabaseCursorWindow(CursorWindowjava:104)
3634 3644 E JavaBinder: at androiddatabaseAbstractWindowedCursorclearOrCreateWindow(AbstractWindowedCursorjava:198)
3634 3644 E JavaBinder: at androiddatabasesqliteSQLiteCursorfillWindow(SQLiteCursorjava:147)
3634 3644 E JavaBinder: at androiddatabasesqliteSQLiteCursorgetCount(SQLiteCursorjava:141)
3634 3644 E JavaBinder: at androiddatabaseCursorToBulkCursorAdaptorgetBulkCursorDescriptor(CursorToBulkCursorAdaptorjava:143)
3634 3644 E JavaBinder: at androidcontentContentProviderNativeonTransact(ContentProviderNativejava:118)
3634 3644 E JavaBinder: at androidosBinderexecTransact(Binderjava:367)
3634 3644 E JavaBinder: at dalviksystemNativeStartrun(Native Method)
1 Cursor 检测原理
在 Cursor 对象被 JVM 回收运行到 finalize() 方法的时候,检测 close() 方法有没有被调用,此办法在 ContentResolver 里面也得到应用。简化后的示例代码如下:
1 import androiddatabaseCursor;
2 import androiddatabaseCursorWrapper;
3 import androidutilLog;
4
5 public class TestCursor extends CursorWrapper {
6 private static final String TAG = "TestCursor";
7 private boolean mIsClosed = false;
8 private Throwable mTrace;
9
10 public TestCursor(Cursor c) {
11 super(c);
12 mTrace = new Throwable("Explicit termination method 'close()' not called");
13 }
14
15 @Override
16 public void close() {
17 mIsClosed = true;
18 }
19
20 @Override
21 public void finalize() throws Throwable {
22 try {
23 if (mIsClosed != true) {
24 Loge(TAG, "Cursor leaks", mTrace);
25 }
26 } finally {
27 superfinalize();
28 }
29 }
30 }
然后查询的时候,把 TestCursor 作为查询结果返回给 APP:
1 return new TestCursor(cursor); // cursor 是普通查询得到的结果,例如从 ContentProviderquery()
该方法同样适合于所有需要检测显式释放资源方法没有被调用的情形,是一种通用方法。但在 finalize() 方法里检测需要注意
优点:准确。因为该资源在 Cursor 对象被回收时仍没被释放,肯定是发生了资源泄露。
缺点:依赖于 finalize() 方法,也就依赖于 JVM 的垃圾回收策略。例如某 APP 现在有 10 个 Cursor 对象泄露,并且这 10 个对象已经不再被任何引用指向处于可回收状态,但是 JVM 可能并不会马上回收(时间不可预测),如果你现在检查不能够发现问题。另外,在某些情况下就算对象被回收 finalize() 可能也不会执行,也就是不能保证检测出所有问题。关于 finalize() 更多信息可以参考《Effective Java 2nd Edition》的 Item 7: Avoid Finalizers
2 使用方法
对于 APP 开发人员
从 GINGERBREAD 开始 Android 就提供了 StrictMode 工具协助开发人员检查是否不小心地做了一些不该有的 *** 作。使用方法是在 Activity 里面设置 StrictMode,下面的例子是打开了检查泄漏的 SQLite 对象以及 Closeable 对象(普通 Cursor/FileInputStream 等)的功能,发现有违规情况则记录 log 并使程序强行退出。
1 import androidosStrictMode;
2
3 public class TestActivity extends Activity {
4 private static final boolean DEVELOPER_MODE = true;
5 public void onCreate() {
6 if (DEVELOPER_MODE) {
7 StrictModesetVMPolicy(new StrictModeVMPolicyBuilder()
8 detectLeakedSqlLiteObjects()
9 detectLeakedClosableObjects()
10 penaltyLog()
11 penaltyDeath()
12 build());
13 }
14 superonCreate();
15 }
16 }
对于 framework 开发人员
如果是通过 ContentProvider 提供数据库数据,在 ContentResolver 里面已有 CloseGuard 类实行类似检测,但需要自行打开(上例也是打开 CloseGuard):
1 CloseGuardsetEnabled(true);
更值得推荐的办法是按照本文第一节中的检测原理,在 ContentResolver 内部类 CursorWrapperInner 里面加入。其他需要检测类似于资源泄漏的,同样可以使用该检测原理。
3 容易出错的地方
忘记调用 close() 这种低级错误没什么好说的,这种应该也占不小的比例。下面说说不太明显的例子。
提前返回
有时候粗心会犯这种错误,在 close() 调用之前就 return 了,特别是函数比较大逻辑比较复杂时更容易犯错。这种情况可以通过把 close() 放在 finally 代码块解决
1 private void method() {
2 Cursor cursor = query(); // 假设 query() 是一个查询数据库返回 Cursor 结果的函数
3 if (flag == false) { // !!提前返回
4 return;
5 }
6 cursorclose();
7 }
类的成员变量
假设类里面有一个在类全局有效的成员变量,在方法 A 获取了查询结果,后面在其他地方又获取了一次查询结果,那么第二次查询的时候就应该先把前面一个 Cursor 对象关闭。
1 public class TestCursor {
2 private Cursor mCursor;
3
4 private void methodA() {
5 mCursor = query();
6 }
7
8 private void methodB() {
9 // !!必须先关闭上一个 cursor 对象
10 mCursor = query();
11 }
12 }
注意:曾经遇到过有人对 mCursor 感到疑惑,明明是同一个变量为什么还需要先关闭?首先 mCursor 是一个 Cursor 对象的引用,在 methodA 时 mCursor 指向了 query() 返回的一个 Cursor 对象 1;在 methodB() 时它又指向了返回的另外一个 Cursor 对象 2。在指向 Cursor 对象 2 之前必须先关闭 Cursor 对象 1,否则就出现了 Cursor 对象 1 在 finalize() 之前没有调用 close() 的情况。
异常处理
打开和关闭 Cursor 之间的代码出现 exception,导致没有跑到关闭的地方:
1 try {
2 Cursor cursor = query();
3 // 中间省略某些出现异常的代码
4 cursorclose();
5 } catch (Exception e) {
6 // !!出现异常没跑到 cursorclose()
7 }
这种情况应该把 close() 放到 finally 代码块里面:
1 Cursor cursor = null;
2 try {
3 cursor = query();
4 // 中间省略某些出现异常的代码
5 } catch (Exception e) {
6 // 出现异常
7 } finally {
8 if (cursor != null)
9 cursorclose();
10 }
SQL注入漏洞的危害不仅体现在数据库层面,还有可能危及承载数据库的 *** 作系统;如果SQL注入被用来挂马,还可能用来传播恶意软件等,这些危害包括但不限于:
数据库信息泄漏:数据库中存储的用户隐私信息泄露。
网页篡改:通过 *** 作数据库对特定网页进行篡改。
网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。
数据库被恶意 *** 作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
服务器被远程控制,被安装后门:经由数据库服务器提供的 *** 作系统支持,让黑客得以修改或控制 *** 作系统。
破坏硬盘数据,瘫痪全系统。
XSS跨站脚本漏洞的危害包括但不限于:
钓鱼欺骗:最典型的就是利用目标网站的反射型跨站脚本漏洞将目标网站重定向到钓鱼网站,或者注入钓鱼JavaScript以监控目标网站的表单输入,甚至发起基于DHTML更高级的钓鱼攻击方式。
网站挂马:跨站后利用IFrame嵌入隐藏的恶意网站或者将被攻击者定向到恶意网站上,或者d出恶意网站窗口等方式都可以进行挂马攻击。
身份盗用:Cookie是用户对于特定网站的身份验证标志,XSS可以**用户的Cookie,从而利用该Cookie获取用户对该网站的 *** 作权限。如果一个网站管理员用户Cookie被窃取,将会对网站引发巨大的危害。
**网站用户信息:当能够窃取到用户Cookie从而获取到用户身份时,攻击者可以获取到用户对网站的 *** 作权限,从而查看用户隐私信息。
垃圾信息发送:比如在SNS社区中,利用XSS漏洞借用被攻击者的身份发送大量的垃圾信息给特定的目标群体。
劫持用户Web行为:一些高级的XSS攻击甚至可以劫持用户的Web行为,监视用户的浏览历史,发送与接收的数据等等。
XSS蠕虫:XSS蠕虫可以用来打广告、刷流量、挂马、恶作剧、破坏网上数据、实施DDoS攻击等。
内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存。
内存中加载的数据量过于庞大,如一次从数据库取出过多数据;集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;代码中存在死循环或循环产生过多重复的对象实体;使用的第三方软件中的BUG;启动参数内存值设定的过小;
检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
检查代码中是否有死循环或递归调用。
以上就是关于什么是数据库连接泄漏全部的内容,包括:什么是数据库连接泄漏、用网易邮箱发送邮件会被查找到发送地点吗、网易邮箱二次验证如何关闭等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)